use clap::Parser;
#[derive(Debug, Parser)]
enum Args {
Autonym(AutonymArgs),
Tag(TagArgs),
Is(IsArgs),
#[clap(name = "has-1")]
Has1(Has1Args),
Script(ScriptArgs),
Lcid(LcidArgs),
FromLcid(FromLcidArgs),
}
#[derive(Debug, Parser)]
struct FromLcidArgs {
lcid: u32,
#[clap(short = 'p', long = "pseudo")]
allow_pseudo: bool,
}
#[derive(Debug, Parser)]
struct AutonymArgs {
tag: String,
}
#[derive(Debug, Parser)]
struct TagArgs {
#[clap(short = '1')]
to_tag1: bool,
#[clap(short = '3')]
to_tag3: bool,
tag: String,
}
#[derive(Debug, Parser)]
struct IsArgs {
#[clap(short = '1')]
is_tag1: bool,
#[clap(short = '3')]
is_tag3: bool,
tag: String,
}
#[derive(Debug, Parser)]
struct Has1Args {
tag: String,
}
#[derive(Debug, Parser)]
struct ScriptArgs {
tag: String,
}
#[derive(Debug, Parser)]
struct LcidArgs {
tag: String,
#[clap(short, long)]
script: Option<String>,
#[clap(short, long)]
region: Option<String>,
#[clap(short = 'p', long = "pseudo")]
allow_pseudo: bool,
#[clap(short = 'i', long = "signed")]
as_signed: bool,
#[clap(short = 'x', long = "hex")]
as_hex: bool,
}
fn main() {
match Args::parse() {
Args::FromLcid(x) => {
match iso639::lcid::get_by_lcid(x.lcid) {
Some(v) => {
println!("{:?}", v);
return;
}
None => {}
};
if x.allow_pseudo {
match iso639::parse_pseudo_lcid(x.lcid) {
Ok((tag, region)) => match region {
Some(region) => println!("{}-{}", tag, region),
None => println!("{}", tag),
},
Err(e) => {
eprintln!("{:?}", e);
std::process::exit(1)
}
}
} else {
std::process::exit(1);
}
}
Args::Lcid(x) => {
let script = x.script.as_ref().map(|x| &**x);
let region = x.region.as_ref().map(|x| &**x);
let lcid = match iso639::lcid::get(&*x.tag, script, region) {
Some(v) => {
v.lcid
}
None => {
if x.allow_pseudo {
let result =
iso639::make_pseudo_lcid(&x.tag, x.region.as_ref().map(|x| &**x));
match result {
Ok(v) => {
println!("WARNING: Pseudo-LCID.");
v
}
Err(e) => {
eprintln!("{:?}", e);
std::process::exit(1)
}
}
} else {
std::process::exit(1)
}
}
};
match (x.as_signed, x.as_hex) {
(true, true) => println!("{:x}", lcid as i32),
(true, false) => println!("{}", lcid as i32),
(false, true) => println!("{:x}", lcid),
(false, false) => println!("{}", lcid),
}
}
Args::Script(x) => {
let r = match iso639::script::get(&*x.tag) {
Some(v) => v,
None => std::process::exit(1),
};
println!("{}", r.script);
}
Args::Autonym(x) => {
let r = match iso639::autonym::get(&*x.tag) {
Some(v) => v,
None => std::process::exit(1),
};
println!("{}", r.autonym.unwrap_or_else(|| r.name));
}
Args::Tag(x) => {
let r = match iso639::autonym::get(&*x.tag) {
Some(v) => v,
None => std::process::exit(1),
};
if x.to_tag1 {
if let Some(v) = r.tag1 {
println!("{}", v);
} else {
std::process::exit(1)
}
} else if x.to_tag3 {
println!("{}", r.tag3);
}
}
Args::Is(x) => {
let r = match iso639::autonym::get(&*x.tag) {
Some(v) => v,
None => std::process::exit(1),
};
if x.is_tag1 {
if let Some(v) = r.tag1 {
if v == x.tag {
return;
} else {
std::process::exit(1)
}
} else {
std::process::exit(1)
}
} else if x.is_tag3 {
if r.tag3 == x.tag {
return;
} else {
std::process::exit(1)
}
}
}
Args::Has1(x) => {
let r = match iso639::autonym::get(&*x.tag) {
Some(v) => v,
None => std::process::exit(1),
};
if r.tag1.is_some() {
return;
}
std::process::exit(1);
}
}
}