From 4557fe7a79500450a103ea11b6dbb4b4edaabdf3 Mon Sep 17 00:00:00 2001 From: cool-mist Date: Sat, 30 Sep 2023 23:02:18 +0530 Subject: [PATCH] Initial implementation --- .gitignore | 2 + Cargo.lock | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 9 ++++ src/main.rs | 104 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 249 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9026c77 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +.vscode diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..9ba39bc --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,134 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bytecount" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" + +[[package]] +name = "enc" +version = "0.1.0" +dependencies = [ + "tabled", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "papergrid" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ccbe15f2b6db62f9a9871642746427e297b0ceb85f9a7f1ee5ff47d184d0c8" +dependencies = [ + "bytecount", + "fnv", + "unicode-width", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tabled" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfe9c3632da101aba5131ed63f9eed38665f8b3c68703a6bb18124835c1a5d22" +dependencies = [ + "papergrid", + "tabled_derive", + "unicode-width", +] + +[[package]] +name = "tabled_derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99f688a08b54f4f02f0a3c382aefdb7884d3d69609f785bd253dc033243e3fe4" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9ab9eaf --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "enc" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tabled = "0.14.0" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..1e5c2f5 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,104 @@ +use std::env; + +use tabled::{ + builder::Builder, + settings::{Modify, object::Rows, Alignment, Style} +}; + +struct StringDetail { + characters: Vec, + len: usize, +} + +struct CharacterDetail { + byte_index: usize, + character: Option, + byte: u8, +} + +impl StringDetail{ + fn parse_utf8(query: &String) -> Self { + let mut details:StringDetail = StringDetail::default(); + for i in query.chars() { + let mut bytes = [0; 4]; + i.encode_utf8(&mut bytes); + + details.push(Some(i), bytes[0]); + for b in 1..i.len_utf8() { + details.push(None, bytes[b]); + } + } + + details + } + + fn default() -> Self { + Self { characters: Vec::new(), len: 0 } + } + + fn push(&mut self, character:Option, byte:u8){ + self.characters + .push(CharacterDetail { + byte_index: self.len, + character, + byte, + }); + self.len += 1; + } + + fn print_table(&self) { + let mut table_builder = Builder::default(); + table_builder.set_header(StringDetail::table_header()); + for i in self.table_rows() { + table_builder.push_record(i); + } + + let table = table_builder.build() + .with(Style::sharp()) + .with(Modify::new(Rows::new(1..)).with(Alignment::left())) + .to_string(); + print!("{}", table); + } + + fn table_rows(&self) -> Vec> { + self.characters.iter() + .map(StringDetail::to_table_row) + .collect::>>() + } + + fn to_table_row(char_detail: &CharacterDetail) -> Vec { + let character: String = match char_detail.character { + Some(x) => String::from(format!("{}", x)), + None => String::from("<..>"), + }; + + vec![ + character, + format!("{}", char_detail.byte_index), + format!("{:02x}", char_detail.byte), + format!("{}", char_detail.byte), + format!("{:08b}", char_detail.byte)] + } + + fn table_header() -> Vec { + vec![ + String::from("character"), + String::from("byte"), + String::from("hex"), + String::from("dec"), + String::from("bin"), + ] + } + +} + +fn main() { + let args: Vec = env::args().collect(); + if args.len() < 2 { + print!("Usage: enc "); + return; + } + + let utf8 = StringDetail::parse_utf8(&args[1]); + utf8.print_table(); +}