getid/
lib.rs

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}