Initial commit

This commit is contained in:
Tristan Ancelet
2026-02-23 10:30:03 -06:00
commit b91ecad7e5
10 changed files with 339 additions and 0 deletions

51
src/command/parser.cr Normal file
View File

@@ -0,0 +1,51 @@
module CliGenerator::Parser
macro extended
macro define_parser
def self.make_parser(parent_parser : OptionParser) : OptionParser
{% puts "#{@type.name} OptionParser is being generated" %}
{% name = @type.name.split("::").last %}
{% var = name.downcase %}
{% info = @type.annotation(::CliGenerator::CommandInfo) %}
subparser = OptionParser.new do |parser|
parser.banner = {{@type.name}}::HEADER
{% subcommands = @type.class.methods.select(&.annotation(::CliGenerator::SubCommand)) %}
{% if subcommands.size > 0 %}
define_section("Subcommands", parser)
{% for subcommand in subcommands %}
{% subcommand_anno = subcommand.annotation(::CliGenerator::SubCommand) %}
parser.on({{subcommand.name.stringify}}, {{subcommand_anno[:description]}}){
{{@type.name}}.action= {{subcommand.name.stringify}}
}
{% end %}
{% end %}
{% arguments = @type.class.methods.select(&.annotation(::CliGenerator::CommandArgument)) %}
{% if arguments.size > 0 %}
define_section("Provide Arguments", parser)
{% for argument in arguments %}
{% argument_anno = argument.annotation(::CliGenerator::CommandArgument) %}
{% if argument_anno[:short] == "" && argument_anno[:long] != "" %}
parser.on({{argument_anno[:long]}}, {{argument_anno[:description]}}){|val|
{% elsif argument_anno[:short] != "" && argument_anno[:long] == "" %}
parser.on({{argument_anno[:short]}}, {{argument_anno[:description]}}){|val|
{% else %}
parser.on({{argument_anno[:short]}}, {{argument_anno[:long]}}, {{argument_anno[:description]}}){|val|
{% end %}
{{@type.name}}.{{argument.name}}(val)
}
{% end %}
{% end %}
define_default_flags(parser)
end
parent_parser.on({{var}}, {{info[:description]}}){
ARGV.delete({{var}})
abort {{var.id}} if ARGV.empty?
subparser.parse
{{@type.name}}.run
}
end
end
end
end