diff --git a/.gitea/workflows/cargo.yaml b/.gitea/workflows/cargo.yaml index b755c81..6b9afbb 100644 --- a/.gitea/workflows/cargo.yaml +++ b/.gitea/workflows/cargo.yaml @@ -37,7 +37,7 @@ jobs: - name: cargo fmt run: cargo fmt --all - name: cargo test - run: cargo test --all-features --all-targets --workspace + run: cargo test --all-features --all-targets --workspace && cargo test --all-features --workspace --doc - name: commit back to repository uses: https://github.com/stefanzweifel/git-auto-commit-action@v5 with: diff --git a/.github/workflows/cargo.yaml b/.github/workflows/cargo.yaml index 29abfde..d2c9936 100644 --- a/.github/workflows/cargo.yaml +++ b/.github/workflows/cargo.yaml @@ -38,7 +38,7 @@ jobs: - name: cargo fmt run: cargo fmt --all - name: cargo test - run: cargo test --all-features --all-targets --workspace + run: cargo test --all-features --all-targets --workspace && cargo test --all-features --workspace --doc - name: commit back to repository uses: stefanzweifel/git-auto-commit-action@v5 with: diff --git a/Cargo.toml b/Cargo.toml index 9f77ac8..4598dd6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,4 +16,6 @@ keywords = ["cli"] anyhow = "1.0.83" clap = { version = "4.5.4", features = ["derive"] } clap-num = "1.1.1" +fast32 = "1.0.2" +libpt = { version = "0.5.0", features = ["bintols"]} diff --git a/src/format.rs b/src/format.rs index baaea0b..fe425df 100644 --- a/src/format.rs +++ b/src/format.rs @@ -1,3 +1,5 @@ +use libpt::bintols::split; + pub type Num = u128; #[derive(Copy, Clone, Debug)] @@ -6,15 +8,26 @@ pub enum Format { Hex, Bin, Octal, + Base64, + Base32, } impl Format { pub fn prefix(&self) -> String { match self { + // apperently used nowhere, sometimes 0 is used as a prefix but I + // think this makes it more clear that this is decimal Format::Dec => "0d", + // very common Format::Hex => "0x", + // very common Format::Bin => "0b", + // somewhat common Format::Octal => "0o", + // perl and a few other programs seem to use this too + Format::Base64 => "0s", + // no idea, I made this up + Format::Base32 => "032s", } .to_string() } @@ -36,6 +49,8 @@ impl Format { Format::Dec => { buf += &format!("{num}"); } + Format::Base64 => buf += &fast32::base64::RFC4648.encode(&split::unsigned_to_vec(num)), + Format::Base32 => buf += &fast32::base32::RFC4648.encode(&split::unsigned_to_vec(num)), } buf } diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..bcab8de --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,10 @@ +//! Format numbers +//! +//! This crate contains several utility functions for formatting numbers +//! into other systems, such as converting decimal numbers to hexadecimal. +//! +//! See [Format] for supported formats. +//! +//! Note that this crate is primarily used as a executable. + +pub mod format; diff --git a/src/main.rs b/src/main.rs index 7f5595e..443fe4b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,7 +13,7 @@ use format::*; #[clap(author, version, about, long_about = None)] #[clap(group( ArgGroup::new("format") - .args(&["hex", "bin", "oct", "dec"]), + .args(&["hex", "bin", "oct", "dec", "base64", "base32"]), ))] struct Cli { #[arg(short, long)] @@ -31,6 +31,12 @@ struct Cli { #[arg(short, long)] /// format to octal oct: bool, + #[arg(short = 's', long)] + /// format to base64 + base64: bool, + #[arg(short = 'z', long)] + /// format to base32 + base32: bool, #[clap(value_parser=maybe_hex::, required=true)] /// at least one number that should be formatted /// @@ -46,6 +52,10 @@ impl Cli { Format::Bin } else if self.dec { Format::Dec + } else if self.base64 { + Format::Base64 + } else if self.base32 { + Format::Base32 } else if self.hex { Format::Hex } else {