1mod hostname;
2
3pub mod args {
4 pub enum AppArgs {
5 Cuid {
6 show_help: bool,
7 slug: bool,
8 },
9 Hostname {
10 show_help: bool,
11 token_length: Option<usize>,
12 },
13 Nanoid {
14 show_help: bool,
15 length: Option<usize>,
16 },
17 Uuidv4 {
18 show_help: bool,
19 urn: bool,
20 simple: bool,
21 },
22 #[allow(dead_code)]
23 Global {
24 show_help: bool,
25 version: bool,
26 },
27 }
28
29 pub fn parse_args() -> Result<AppArgs, Box<dyn std::error::Error>> {
30 let mut args = pico_args::Arguments::from_env();
31
32 let app_args = match args.subcommand()?.as_deref() {
33 Some("cuid") => Ok(AppArgs::Cuid {
34 show_help: args.contains(["-h", "--help"]),
35 slug: args.contains("--slug"),
36 }),
37 Some("nanoid") | Some("nano") => Ok(AppArgs::Nanoid {
38 show_help: args.contains(["-h", "--help"]),
39 length: args.opt_value_from_str("--length")?,
40 }),
41 Some("uuidv4") | Some("uuid") => Ok(AppArgs::Uuidv4 {
42 show_help: args.contains(["-h", "--help"]),
43 simple: args.contains("--simple"),
44 urn: args.contains("--urn"),
45 }),
46 Some("hostname") | Some("heroku") => Ok(AppArgs::Hostname {
47 show_help: args.contains(["-h", "--help"]),
48 token_length: args.opt_value_from_str("--token_length")?,
49 }),
50 Some(s) => Err(format!(
51 "unknown subcommand: {}. Type `getid --help` to see available commands.",
52 s
53 )
54 .into()),
55 None => Ok(AppArgs::Global {
56 show_help: args.contains(["-h", "--help"]),
57 version: args.contains(["-v", "--version"]),
58 }),
59 };
60
61 let remaining = args.finish();
62 if !remaining.is_empty() {
63 eprintln!("Warning: unknown argument(s): {:?}.", remaining);
64 }
65
66 app_args
67 }
68}
69
70pub mod ids {
71 use crate::hostname::hostname;
72 use nanoid::nanoid;
73 use uuid::Uuid;
74
75 pub fn get_cuid(as_slug: bool) -> String {
76 let id = if as_slug { cuid::slug() } else { cuid::cuid() };
77 id.expect("could not acquire cuid:")
78 }
79
80 pub fn get_nanoid(length: Option<usize>) -> String {
81 match length {
82 Some(len) => nanoid!(len),
83 None => nanoid!(),
84 }
85 }
86
87 pub fn get_uuid(as_urn: bool, as_simple: bool) -> String {
88 let uuid = Uuid::new_v4();
89
90 if as_urn {
91 uuid.to_urn().to_string()
92 } else if as_simple {
93 uuid.to_simple().to_string()
94 } else {
95 uuid.to_hyphenated().to_string()
96 }
97 }
98
99 pub fn get_hostname(token_length: Option<usize>) -> String {
100 hostname(token_length.unwrap_or(4))
101 }
102}