///|
fn ends_with(str : String, suffix : String) -> Bool {
let str_len = str.length()
let suffix_len = suffix.length()
str_len >= suffix_len && str[str_len - suffix_len:].to_owned() == suffix
}
///|
fn config_kind(name : String) -> String? {
if ends_with(name, "moon.pkg") {
Some("pkg")
} else if ends_with(name, "moon.mod") {
Some("mod")
} else if ends_with(name, "moon.work") {
Some("work")
} else {
None
}
}
///|
fn file_type_kind(file_type : String) -> String? {
match file_type {
"pkg" => Some("pkg")
"mod" => Some("mod")
"work" => Some("work")
_ => None
}
}
///|
fn kind_name(kind : String) -> String {
match kind {
"pkg" => "moon.pkg"
"mod" => "moon.mod"
"work" => "moon.work"
_ => "moon.pkg"
}
}
///|
fn parse_config(kind : String, source : String) -> @config.Ast {
let name = kind_name(kind)
let (ast, _) = match kind {
"pkg" => @config.parse_moon_pkg(name~, source)
"mod" => @config.parse_moon_mod(name~, source)
"work" => @config.parse_moon_work(name~, source)
_ => @config.parse_moon_pkg(name~, source)
}
ast
}
///|
enum InputSource {
File(String)
Stdin
Code(String)
}
///|
struct LegacyOptions {
source : InputSource
file_type : String?
output : String?
}
///|
enum CliAction {
RunLegacy(LegacyOptions)
Help(String)
Error(String)
}
///|
fn root_usage() -> String {
(
#|Usage: mq
#|
#|MoonBit config tool
#|
#|Commands:
#| legacy Convert Moon config DSL to legacy-compatible JSON output
#| help Print help for the subcommand.
#|
#|Options:
#| -h, --help Show help information.
)
}
///|
fn legacy_usage() -> String {
(
#|Usage: mq legacy [options] [input]
#|
#|Convert Moon config DSL to legacy-compatible JSON output
#|
#|Arguments:
#| input Path to moon.pkg/moon.mod/moon.work, or - for stdin
#|
#|Options:
#| -h, --help Show help information.
#| --file-type File type for stdin or -c input: pkg, mod, or work
#| -c, --code Read config source from command line
#| -o, --output