///|
/// ofd-invoice CLI 入口
/// 用法: ofd-invoice [-i N]
fn main {
let argv = @sys.get_cli_args()
let args = if argv.length() > 1 { argv[1:].to_array() } else { [] }
match run(args) {
Ok(json) => println(json)
Err(msg) => {
println(msg)
@sys.exit(1)
}
}
}
///|
/// 解析参数 → 读取文件 → 解包 → 解析 → 提取发票 → JSON
fn run(argv : Array[String]) -> Result[String, String] {
let config = parse_config(argv[:]) catch {
e =>
return Err(
"参数错误: " + e.to_string() + "\n" + command().render_help(),
)
}
let data = @fs.read_file_to_bytes(config.file) catch {
_ => return Err("无法读取文件: " + config.file)
}
let port = @adaptor.MooncakeOfdPort::from_bytes(data) catch {
e => return Err("OFD 解包失败: " + e.to_string())
}
let reader = match @reader.OfdReader::open(port) {
Ok(r) => r
Err(e) => return Err("OFD 解析失败: " + e.to_string())
}
match @invoice.extract_invoice(reader) {
Ok(inv) => Ok(@invoice.invoice_to_json(inv))
Err(e) => Err("发票提取失败: " + e.to_string())
}
}