# frozen_string_literal: true require "optparse" module MoonModel class CLI def self.run(argv) options = {} parser = OptionParser.new do |opts| opts.banner = "Usage: moon_model [--config FILE] [--output DIR]" opts.on("-c", "--config FILE", "Generate non-interactively from YAML") { |v| options[:config] = v } opts.on("-o", "--output DIR", "Output directory (default: build/)") { |v| options[:output] = v } opts.on("--version", "Print version") { puts VERSION; return 0 } opts.on("-h", "--help", "Show help") { puts opts; return 0 } end parser.parse!(argv) config = options[:config] ? Config.new(YAML.safe_load_file(options[:config], aliases: false)) : Wizard.new.run result = Generator.new(config, output_dir: options[:output]).generate puts "Generated #{result[:files].length} files in #{result[:output_dir]}" puts "Datum diameter: #{format("%.2f", result[:statistics]["diameter_mm"])} mm; final envelope: #{format("%.2f", result[:statistics]["final_envelope_mm"])} mm; relief: #{format("%.3f", result[:statistics]["relief_range_mm"])} mm" 0 rescue OptionParser::ParseError, ArgumentError, Errno::ENOENT, Psych::Exception => e warn "moon_model: #{e.message}" 2 end end end