diff --git a/Cargo.lock b/Cargo.lock index 35fdab7..bb0c242 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,6 +157,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android-activity" version = "0.5.2" @@ -270,6 +276,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + [[package]] name = "arboard" version = "3.5.0" @@ -463,6 +475,15 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "atomic" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" +dependencies = [ + "bytemuck", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -541,15 +562,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + [[package]] name = "bit-set" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" dependencies = [ - "bit-vec", + "bit-vec 0.7.0", ] +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bit-vec" version = "0.7.0" @@ -734,6 +776,15 @@ dependencies = [ "wayland-client 0.31.10", ] +[[package]] +name = "castaway" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +dependencies = [ + "rustversion", +] + [[package]] name = "catppuccin-egui" version = "5.5.0" @@ -928,7 +979,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ "termcolor", - "unicode-width", + "unicode-width 0.1.14", +] + +[[package]] +name = "color-eyre" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e1761c0e16f8883bbbb8ce5990867f4f06bf11a0253da6495a04ce4b6ef0ec" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ddd8d5bfda1e11a501d0a7303f3bfed9aa632ebdb859be40d0fd70478ed70d5" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", ] [[package]] @@ -984,6 +1062,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -993,6 +1085,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "convert_case" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "copypasta" version = "0.8.2" @@ -1148,6 +1249,33 @@ dependencies = [ "winapi", ] +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags 2.9.1", + "crossterm_winapi", + "derive_more", + "document-features", + "mio 1.0.4", + "parking_lot", + "rustix 1.0.7", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -1158,6 +1286,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "csscolorparser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" +dependencies = [ + "lab", + "phf", +] + [[package]] name = "cty" version = "0.2.2" @@ -1176,8 +1314,18 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", ] [[package]] @@ -1194,17 +1342,42 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.101", +] + [[package]] name = "darling_macro" version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core", + "darling_core 0.13.4", "quote", "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.101", +] + [[package]] name = "deflate" version = "0.8.6" @@ -1215,6 +1388,42 @@ dependencies = [ "byteorder", ] +[[package]] +name = "deltae" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5729f5117e208430e437df2f4843f5e5952997175992d1414f94c57d61e270b4" + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "digest" version = "0.10.7" @@ -1520,6 +1729,15 @@ version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + [[package]] name = "event-listener" version = "5.4.0" @@ -1551,6 +1769,26 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fancy-regex" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" +dependencies = [ + "bit-set 0.5.3", + "regex", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -1566,6 +1804,29 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "filedescriptor" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +dependencies = [ + "libc", + "thiserror 1.0.69", + "winapi", +] + +[[package]] +name = "finl_unicode" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94c970b525906eb37d3940083aa65b95e481fc1857d467d13374e1d925cfc163" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.1.1" @@ -1733,7 +1994,6 @@ dependencies = [ "chrono", "clap", "dimensioned", - "env_logger", "flate2", "hex", "log", @@ -1751,6 +2011,8 @@ dependencies = [ "eframe", "egui", "gemma", + "log", + "pretty_env_logger", ] [[package]] @@ -1773,6 +2035,18 @@ dependencies = [ "winit 0.27.5", ] +[[package]] +name = "gemmarat" +version = "0.1.0" +dependencies = [ + "clap", + "color-eyre", + "gemma", + "log", + "pretty_env_logger", + "ratatui", +] + [[package]] name = "gemmatelnet" version = "0.1.0" @@ -1780,6 +2054,7 @@ dependencies = [ "clap", "gemma", "log", + "pretty_env_logger", ] [[package]] @@ -1788,8 +2063,10 @@ version = "0.1.0" dependencies = [ "clap", "gemma", + "log", "pest", "pest_derive", + "pretty_env_logger", ] [[package]] @@ -2104,6 +2381,8 @@ version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", ] @@ -2394,6 +2673,12 @@ dependencies = [ "arrayvec 0.7.6", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "2.9.0" @@ -2404,6 +2689,25 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + +[[package]] +name = "instability" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +dependencies = [ + "darling 0.20.11", + "indoc", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "instant" version = "0.1.13" @@ -2433,6 +2737,24 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -2490,6 +2812,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kasuari" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def1b67294a9fdc95eeeeafd1209c7a1b8a82aa0bf80ac2ab2a7d0318e9c7622" +dependencies = [ + "hashbrown", + "thiserror 2.0.12", +] + [[package]] name = "khronos-egl" version = "6.0.0" @@ -2507,6 +2839,12 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "lab" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf36173d4167ed999940f804952e6b08197cae5ad5d572eb4db150ce8ad5d58f" + [[package]] name = "lazy-bytes-cast" version = "5.0.1" @@ -2546,6 +2884,15 @@ dependencies = [ "redox_syscall 0.5.12", ] +[[package]] +name = "line-clipping" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51a1679740111eb63b7b4cb3c97b1d5d9f82e142292a25edcfdb4120a48b3880" +dependencies = [ + "bitflags 2.9.1", +] + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -2586,6 +2933,25 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "lru" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "mac_address" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0aeb26bf5e836cc1c341c8106051b573f1766dfa05aa87f0b98be5e51b02303" +dependencies = [ + "nix 0.29.0", + "winapi", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -2619,6 +2985,12 @@ dependencies = [ "libc", ] +[[package]] +name = "memmem" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" + [[package]] name = "memoffset" version = "0.6.5" @@ -2652,6 +3024,12 @@ dependencies = [ "paste", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.3.7" @@ -2699,6 +3077,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + [[package]] name = "naga" version = "22.1.0" @@ -2706,7 +3096,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" dependencies = [ "arrayvec 0.7.6", - "bit-set", + "bit-set 0.6.0", "bitflags 2.9.1", "cfg_aliases 0.1.1", "codespan-reporting", @@ -2793,7 +3183,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" dependencies = [ - "darling", + "darling 0.13.4", "proc-macro-crate 1.3.1", "proc-macro2", "quote", @@ -2871,6 +3261,33 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -2953,6 +3370,15 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "objc" version = "0.2.7" @@ -3299,6 +3725,15 @@ dependencies = [ "libredox", ] +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -3318,6 +3753,12 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "owo-colors" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" + [[package]] name = "parking" version = "2.2.1" @@ -3404,6 +3845,58 @@ dependencies = [ "sha2", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -3502,6 +3995,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -3654,6 +4153,90 @@ dependencies = [ "getrandom 0.3.3", ] +[[package]] +name = "ratatui" +version = "0.30.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63bfff7501cc6892821f54f1133661e0534413342c8e8efbb41af0ffccdcea45" +dependencies = [ + "instability", + "ratatui-core", + "ratatui-crossterm", + "ratatui-macros", + "ratatui-termwiz", + "ratatui-widgets", +] + +[[package]] +name = "ratatui-core" +version = "0.1.0-alpha.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353047185fbfb81ee05a3f8c573956adb2aa9a505da47fb150c18388806f5e22" +dependencies = [ + "bitflags 2.9.1", + "compact_str", + "hashbrown", + "indoc", + "itertools 0.14.0", + "kasuari", + "lru", + "strum", + "thiserror 2.0.12", + "unicode-segmentation", + "unicode-truncate", + "unicode-width 0.2.0", +] + +[[package]] +name = "ratatui-crossterm" +version = "0.1.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c729303ad253dd928b75f5866feb41c73d0e72b62ec91b13a5d91141ff5bfd1" +dependencies = [ + "crossterm", + "instability", + "ratatui-core", +] + +[[package]] +name = "ratatui-macros" +version = "0.7.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058564a94bc18220b5c37caf05ec334e362bc87711522703fbed1ec9c43a0eae" +dependencies = [ + "ratatui-core", + "ratatui-widgets", +] + +[[package]] +name = "ratatui-termwiz" +version = "0.1.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca620dea5f1b7e949fc60a7d78626946dc0273707d28eed4ce3ee458ae0218ca" +dependencies = [ + "ratatui-core", + "termwiz", +] + +[[package]] +name = "ratatui-widgets" +version = "0.3.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fab55e77e0421bb88944cc0262317688e039d0e58518195f13a6e689f3e22f42" +dependencies = [ + "bitflags 2.9.1", + "hashbrown", + "indoc", + "instability", + "itertools 0.14.0", + "line-clipping", + "ratatui-core", + "strum", + "time", + "unicode-segmentation", + "unicode-width 0.2.0", +] + [[package]] name = "raw-window-handle" version = "0.4.3" @@ -3973,12 +4556,42 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio 1.0.4", + "signal-hook", +] + [[package]] name = "signal-hook-registry" version = "1.4.5" @@ -3994,6 +4607,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -4156,6 +4775,28 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + [[package]] name = "syn" version = "1.0.109" @@ -4217,6 +4858,69 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminfo" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662" +dependencies = [ + "fnv", + "nom", + "phf", + "phf_codegen", +] + +[[package]] +name = "termios" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" +dependencies = [ + "libc", +] + +[[package]] +name = "termwiz" +version = "0.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" +dependencies = [ + "anyhow", + "base64", + "bitflags 2.9.1", + "fancy-regex", + "filedescriptor", + "finl_unicode", + "fixedbitset", + "hex", + "lazy_static", + "libc", + "log", + "memmem", + "nix 0.29.0", + "num-derive", + "num-traits", + "ordered-float", + "pest", + "pest_derive", + "phf", + "sha2", + "signal-hook", + "siphasher", + "terminfo", + "termios", + "thiserror 1.0.69", + "ucd-trie", + "unicode-segmentation", + "vtparse", + "wezterm-bidi", + "wezterm-blob-leases", + "wezterm-color-types", + "wezterm-dynamic", + "wezterm-input-types", + "winapi", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -4257,6 +4961,16 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tiff" version = "0.6.1" @@ -4268,6 +4982,27 @@ dependencies = [ "weezl", ] +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + [[package]] name = "tiny-skia" version = "0.7.0" @@ -4385,6 +5120,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", ] [[package]] @@ -4437,12 +5194,29 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-truncate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fbf03860ff438702f3910ca5f28f8dac63c1c11e7efb5012b8b175493606330" +dependencies = [ + "itertools 0.13.0", + "unicode-segmentation", + "unicode-width 0.2.0", +] + [[package]] name = "unicode-width" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -4472,6 +5246,24 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "atomic", + "getrandom 0.3.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "vec_map" version = "0.8.2" @@ -4484,6 +5276,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vtparse" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9b2acfb050df409c972a37d3b8e08cdea3bddb0c09db9d53137e504cfabed0" +dependencies = [ + "utf8parse", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -4853,6 +5654,78 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +[[package]] +name = "wezterm-bidi" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0a6e355560527dd2d1cf7890652f4f09bb3433b6aadade4c9b5ed76de5f3ec" +dependencies = [ + "log", + "wezterm-dynamic", +] + +[[package]] +name = "wezterm-blob-leases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692daff6d93d94e29e4114544ef6d5c942a7ed998b37abdc19b17136ea428eb7" +dependencies = [ + "getrandom 0.3.3", + "mac_address", + "sha2", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "wezterm-color-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de81ef35c9010270d63772bebef2f2d6d1f2d20a983d27505ac850b8c4b4296" +dependencies = [ + "csscolorparser", + "deltae", + "lazy_static", + "wezterm-dynamic", +] + +[[package]] +name = "wezterm-dynamic" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" +dependencies = [ + "log", + "ordered-float", + "strsim 0.11.1", + "thiserror 1.0.69", + "wezterm-dynamic-derive", +] + +[[package]] +name = "wezterm-dynamic-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c0cf2d539c645b448eaffec9ec494b8b19bd5077d9e58cb1ae7efece8d575b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wezterm-input-types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7012add459f951456ec9d6c7e6fc340b1ce15d6fc9629f8c42853412c029e57e" +dependencies = [ + "bitflags 1.3.2", + "euclid", + "lazy_static", + "serde", + "wezterm-dynamic", +] + [[package]] name = "wgpu" version = "22.1.0" @@ -4884,7 +5757,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" dependencies = [ "arrayvec 0.7.6", - "bit-vec", + "bit-vec 0.7.0", "bitflags 2.9.1", "cfg_aliases 0.1.1", "document-features", @@ -5478,7 +6351,7 @@ dependencies = [ "libc", "log", "mint", - "mio", + "mio 0.8.11", "ndk 0.7.0", "ndk-glue", "objc", diff --git a/Cargo.toml b/Cargo.toml index a590ee7..77e28c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,19 +5,21 @@ members = [ "gemmaimgui", "gemmatelnet", "gemmautil", + "gemmarat" ] resolver = "2" [workspace.dependencies] pretty_env_logger = { version = "0.5" } -log = { version = "0.4" } +log = { version = "0.4" } rand = { version = "0.9.0-alpha.2" } chrono = { version = "0.4" } dimensioned = { version = "0.8" } serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0" } clap = { version = "4.5", features = ["derive"] } - +flate2 = { version = "1.1" } +hex = { version = "0.4" } # EGUI egui = { version = "0.29" } eframe = { version = "0.29" } diff --git a/gemma/Cargo.toml b/gemma/Cargo.toml index a51c8f3..c0c2b49 100644 --- a/gemma/Cargo.toml +++ b/gemma/Cargo.toml @@ -7,13 +7,11 @@ autobenches = true [dependencies] pretty_env_logger.workspace = true rand.workspace = true -log.workspace = true -# beep = "0.3.0" chrono.workspace = true dimensioned.workspace = true serde.workspace = true serde_json.workspace = true -flate2 = "1.0" -clap = { version = "4.5.20", features = ["derive"] } -hex = "0.4.3" -env_logger = "0.10.2" +flate2.workspace = true +clap.workspace = true +hex.workspace = true +log.workspace = true \ No newline at end of file diff --git a/gemma/src/bin/testcompression.rs b/gemma/src/bin/testcompression.rs index 19a1fa9..dcf1483 100644 --- a/gemma/src/bin/testcompression.rs +++ b/gemma/src/bin/testcompression.rs @@ -103,7 +103,7 @@ fn decompress_file(input_path: &PathBuf) -> io::Result<()> { } fn main() { - env_logger::init(); + pretty_env_logger::init(); let cli = Cli::parse(); diff --git a/gemma/src/chip8/computer.rs b/gemma/src/chip8/computer.rs index 8729b46..5b80282 100644 --- a/gemma/src/chip8/computer.rs +++ b/gemma/src/chip8/computer.rs @@ -91,7 +91,7 @@ impl Chip8Computer { pub fn step_system(&mut self) -> &mut Chip8Computer { - println!("Stepping System 1 Step"); + // println!("Stepping System 1 Step"); // read the next instruction let local_memory = &self.memory; diff --git a/gemma/src/chip8/instructions.rs b/gemma/src/chip8/instructions.rs index 1dab8ed..8dfeec8 100644 --- a/gemma/src/chip8/instructions.rs +++ b/gemma/src/chip8/instructions.rs @@ -1019,7 +1019,7 @@ impl Chip8CpuInstructions { } Chip8CpuInstructions::LDIS(new_time) => { let new_value = input.registers.peek(*new_time); - input.sound_timer.set_timer(new_value as i32); + input.sound_timer.set_timer(new_value); } Chip8CpuInstructions::ADDI(x) => { // Fx1E - ADD I, Vx diff --git a/gemma/src/chip8/sound_timer.rs b/gemma/src/chip8/sound_timer.rs index 8cf1f31..c9757d5 100644 --- a/gemma/src/chip8/sound_timer.rs +++ b/gemma/src/chip8/sound_timer.rs @@ -1,9 +1,11 @@ -use log::trace; +extern crate pretty_env_logger; + +use log::warn; use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Serialize, Deserialize, Debug)] pub struct SoundTimer { - counter: i32, + counter: u8, } impl Default for SoundTimer { @@ -13,32 +15,25 @@ impl Default for SoundTimer { } impl SoundTimer { - pub fn current(&self) -> i32 { + pub fn current(&self) -> u8 { self.counter } pub fn new() -> Self { SoundTimer { counter: 0 } } - pub fn set_timer(&mut self, new_value: i32) { - trace!("SETTING SOUND TIMER TO {new_value}"); + pub fn set_timer(&mut self, new_value: u8) { + warn!("SETTING SOUND TIMER TO {new_value}"); self.counter = new_value } pub fn tick(&mut self) { - trace!( + warn!( "TICKING SOUND FROM {} to {}", self.counter, self.counter - 1 ); if self.counter > 0 { self.counter -= 1; - /* - todo: this breaks tests. maybe its wrong? - if let good_thread = thread::spawn(|| { - beep(440).expect("Unable to beep"); - thread::sleep(time::Duration::from_millis(500)); - }).join().unwrap(). - */ } } diff --git a/gemma/src/constants.rs b/gemma/src/constants.rs index 8e20e30..2320f07 100644 --- a/gemma/src/constants.rs +++ b/gemma/src/constants.rs @@ -1,3 +1,8 @@ +use std::borrow::ToOwned; +use std::clone::Clone; +use std::net::ToSocketAddrs; +use std::string::ToString; + pub const CHIP8_REGISTER_COUNT: i32 = 16; pub const CHIP8_MEMORY_SIZE: i32 = 4096i32; pub const CHIP8_VIDEO_WIDTH: i32 = 64i32; @@ -9,9 +14,10 @@ pub const LABEL_QUIRK_CHIP8: &str = "Chip8"; pub const LABEL_QUIRK_XOCHIP: &str = "XO Chip"; pub const LABEL_QUIRK_SCHIP: &str = "SChip-Modern"; -pub const RESOURCES_ROOT: &str = "../resources"; -pub const TESTS_ROOT: &str = "../resources/test/"; -pub const TEST_ROM_ROOT: &str = "../resources/test/roms"; +pub const BASE_ROOT: &'static str = &(env!("CARGO_MANIFEST_DIR")); +pub const RESOURCES_ROOT: &'static str = concat!(env!("CARGO_MANIFEST_DIR"), "/../resources"); +pub const TESTS_ROOT: &'static str = concat!(env!("CARGO_MANIFEST_DIR"), "/../resources/test"); +pub const TEST_ROM_ROOT: &'static str =concat!(env!("CARGO_MANIFEST_DIR"), "/../resources/test/roms"); pub const CHIP8_KEYBOARD: [[u8; 4]; 4] = [ [0x01, 0x02, 0x03, 0x0C], diff --git a/gemma/tests/computer_tests.rs b/gemma/tests/computer_tests.rs index 11f0b4b..3416578 100644 --- a/gemma/tests/computer_tests.rs +++ b/gemma/tests/computer_tests.rs @@ -6,7 +6,7 @@ use gemma::chip8::computer_manager::Chip8ComputerManager; use gemma::chip8::quirk_modes::QuirkMode; use gemma::chip8::quirk_modes::QuirkMode::{Chip8, SChipModern, XOChip}; use gemma::chip8::registers::Chip8Registers; -use gemma::constants::{CHIP8_VIDEO_MEMORY, TESTS_ROOT}; +use gemma::constants::{CHIP8_VIDEO_MEMORY, TESTS_ROOT, TEST_ROM_ROOT}; use crate::test_utils::{load_compressed_result, load_result, load_rom}; #[test] @@ -187,7 +187,7 @@ fn quirks_mode_test() { fn load_rom_allows_starting() { let mut new_manager = Chip8ComputerManager::default(); assert!(!new_manager.core_should_run); - let p = format!("{}/../resources/test/roms/1-chip8-logo.ch8" , std::env::current_dir().unwrap().display()); + let p = TEST_ROM_ROOT.to_string() + "/1-chip8-logo.ch8"; let full_path = Path::new(p.as_str()); new_manager.load_new_program_from_disk_to_system_memory(full_path); assert!(new_manager.core_should_run) diff --git a/gemma/tests/state_tests.rs b/gemma/tests/state_tests.rs index 55c09bd..265f0e2 100644 --- a/gemma/tests/state_tests.rs +++ b/gemma/tests/state_tests.rs @@ -11,20 +11,6 @@ fn load_result(to_load: &str) -> String { std::fs::read_to_string(full_path).unwrap() } -// fn load_compressed_result(file_path: &str) -> io::Result { -// // Load the compressed file contents -// let compressed_data = fs::read(file_path)?; -// -// // Create a GzDecoder to uncompress the data -// let mut decoder = GzDecoder::new(&mut compressed_data[..]); -// let mut decompressed_data = String::new(); -// -// // Read the decompressed data directly into a String -// decoder.read_to_string(&mut decompressed_data)?; -// -// Ok(decompressed_data) -// } - fn load_rom(to_load: &str) -> Vec { fs::read(format!("resources/test/roms/{}", to_load)).unwrap() } diff --git a/gemmaegui/Cargo.toml b/gemmaegui/Cargo.toml index f0c8646..d8e4589 100644 --- a/gemmaegui/Cargo.toml +++ b/gemmaegui/Cargo.toml @@ -8,3 +8,5 @@ gemma = { path = "../gemma" } egui.workspace = true eframe.workspace = true catppuccin-egui = { version = "5.3.0", default-features = false, features = ["egui29"] } +pretty_env_logger.workspace = true +log.workspace = true \ No newline at end of file diff --git a/gemmaimgui/Cargo.toml b/gemmaimgui/Cargo.toml index 8dfcf29..98eff5c 100644 --- a/gemmaimgui/Cargo.toml +++ b/gemmaimgui/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" [dependencies] gemma = { path = "../gemma" } pretty_env_logger.workspace = true -rand.workspace = true log.workspace = true +rand.workspace = true chrono.workspace = true dimensioned.workspace = true clap.workspace = true diff --git a/gemmarat/Cargo.toml b/gemmarat/Cargo.toml new file mode 100644 index 0000000..431b227 --- /dev/null +++ b/gemmarat/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "gemmarat" +version = "0.1.0" +edition = "2024" + +[dependencies] +gemma = { path = "../gemma" } +clap.workspace = true +pretty_env_logger.workspace = true +log.workspace = true +color-eyre = "0.6" +ratatui = "0.30.0-alpha.4" diff --git a/gemmarat/src/bin/gemmarat.rs b/gemmarat/src/bin/gemmarat.rs new file mode 100644 index 0000000..5dd19cb --- /dev/null +++ b/gemmarat/src/bin/gemmarat.rs @@ -0,0 +1,135 @@ +use std::path::Path; +use std::rc::Rc; +use ratatui::prelude::*; +use std::time::Duration; +use color_eyre::{eyre::Context, Result}; +use ratatui::{ + crossterm::event::{self, Event, KeyCode}, + widgets::Paragraph, + DefaultTerminal, Frame, +}; +use ratatui::layout::Rect; +use ratatui::layout::{Constraint, Direction}; +use ratatui::prelude::Layout; +use ratatui::widgets::{Block, Borders}; +use gemma::chip8::computer::Chip8Computer; +use gemma::chip8::computer_manager::Chip8ComputerManager; +use gemmarat::register_widget::RegisterWidget; +use gemmarat::timer_widget::TimerWidget; +use gemmarat::video_widget::VideoWidget; + +struct GemmaRat { + pub computer: Chip8ComputerManager +} + +impl Default for GemmaRat { + fn default() -> Self { + GemmaRat { + computer: Chip8ComputerManager::default() + } + } +} + +fn main() -> Result<()> { + color_eyre::install()?; + let terminal = ratatui::init(); + let app_result = run(terminal).context("app loop failed"); + ratatui::restore(); + app_result +} + + +fn run(mut terminal: DefaultTerminal) -> Result<()> { + let mut manager = Chip8ComputerManager::default(); + manager.load_new_program_from_disk_to_system_memory(Path::new("/home/tmerritt/Projects/trevors_chip8_toy/resources/roms/2-ibm-logo.ch8")); + for _ in 0..30 { + manager.tick(); + } + loop { + terminal.draw(|frame| { + do_draw(frame, &mut manager); + }).expect("unable to render display."); + if should_quit()? { + break; + } + } + Ok(()) +} + +fn do_draw(frame: &mut Frame, draw_with: &mut Chip8ComputerManager) { + // build the layout... + let main_layout = Layout::default() + .direction(Direction::Vertical) + .constraints(vec![ + Constraint::Length(32), + Constraint::Max(3) + ]) + .split(frame.area()); + let upper_block = Layout::default() + .direction(Direction::Horizontal) + .constraints(vec![ + Constraint::Length(64), + Constraint::Fill(1) + ]) + .split(main_layout[0]); + let column_block = Layout::default() + .direction(Direction::Vertical) + .constraints(vec![ + // Registers + Constraint::Min(20), + // Timers + Constraint::Min(6), + // Keypad + Constraint::Min(8) + ]) + .split(upper_block[1]); + // ...then put the parts in the layout. + + + // Video Block + let state = draw_with.state().clone().video_memory; + frame.render_widget( + VideoWidget::with_display(state), upper_block[0] + ); + + // Registers Block + let mut state = draw_with.state().registers; + frame.render_stateful_widget( + RegisterWidget::new(), + column_block[0], + &mut state); + + // Times Block + frame.render_stateful_widget( + TimerWidget::new(), + column_block[1], + &mut TimerWidget::with_values( + draw_with.state().sound_timer.current(), + draw_with.state().delay_timer.current() + ) + ); + + // Keypad Block + frame.render_widget( + Paragraph::new("Keypad Goes Here") + .block(Block::new().borders(Borders::ALL)), column_block[2] + ); + + // Footer Bar + frame.render_widget( + Paragraph::new("F1 - Step | F2 - Run | F3 - Stop | Q - Quit") + .centered() + .block(Block::new().borders(Borders::ALL)), main_layout[1]); + +} + +fn should_quit() -> Result { + if event::poll(Duration::from_millis(250)).context("event poll failed")? { + if let Event::Key(key) = event::read().context("event read failed")? { + return Ok(KeyCode::Char('q') == key.code); + } + } + Ok(false) +} + + diff --git a/gemmarat/src/lib.rs b/gemmarat/src/lib.rs new file mode 100644 index 0000000..ffd8d11 --- /dev/null +++ b/gemmarat/src/lib.rs @@ -0,0 +1,3 @@ +pub mod timer_widget; +pub mod register_widget; +pub mod video_widget; diff --git a/gemmarat/src/register_widget.rs b/gemmarat/src/register_widget.rs new file mode 100644 index 0000000..cf84bf0 --- /dev/null +++ b/gemmarat/src/register_widget.rs @@ -0,0 +1,43 @@ +use ratatui::layout::Rect; +use ratatui::prelude::*; +use ratatui::widgets::{Block, Borders, List, ListItem, ListState}; +use gemma::chip8::registers::Chip8Registers; + +pub struct RegisterWidget { + state: Chip8Registers +} + +impl RegisterWidget { + pub fn new() -> RegisterWidget { + RegisterWidget { state: Chip8Registers::default() } + } + + pub fn with_values(state: Chip8Registers) -> RegisterWidget { + RegisterWidget { + state + } + } +} + +impl StatefulWidget for RegisterWidget { + type State = Chip8Registers; + + fn render(self, area: Rect, buf: &mut Buffer, state: &mut Chip8Registers) { + let mut working_lines: Vec = vec![]; + + // build the lines for the display... + let working_text = state.format_as_string(); + + for current_line in working_text.lines() { + working_lines.push(ListItem::new(current_line)); + } + + let my_list = List::new(working_lines) + .block(Block::new() + .title(Line::raw("Registers").centered()) + .borders(Borders::ALL)); + // ...draw it out; + + StatefulWidget::render(my_list, area, buf, &mut ListState::default()); + } +} diff --git a/gemmarat/src/timer_widget.rs b/gemmarat/src/timer_widget.rs new file mode 100644 index 0000000..ad08cc2 --- /dev/null +++ b/gemmarat/src/timer_widget.rs @@ -0,0 +1,39 @@ +use ratatui::prelude::*; +use ratatui::widgets::{Block, Paragraph}; +use ratatui::text::Line; + +pub struct TimerWidget { + sound_timer_value: u8, + delay_timer_value: u8 +} + +impl TimerWidget { + pub fn new() -> TimerWidget { + TimerWidget { sound_timer_value: 0, delay_timer_value: 0 } + } + + pub fn with_values(sound: u8, delay: u8) -> TimerWidget { + TimerWidget { + sound_timer_value: sound, + delay_timer_value: delay + } + } +} + +impl StatefulWidget for TimerWidget { + type State = TimerWidget; + + fn render(self, area: Rect, buf: &mut Buffer, state: &mut TimerWidget) { + let line_1 = Span::raw(format!("Sound Timer: {} [{:02x}]", state.sound_timer_value, state.sound_timer_value)); + let line_2 = Span::raw(format!("Delay Timer: {} [{:02x}]", state.delay_timer_value, state.delay_timer_value)); + + let text = vec![ + Line::from(vec![line_1]), + Line::from(vec![line_2]) + ]; + + let line = Paragraph::new(text) + .block(Block::bordered().title("Timers")); + line.render(area, buf); + } +} diff --git a/gemmarat/src/video_widget.rs b/gemmarat/src/video_widget.rs new file mode 100644 index 0000000..0701473 --- /dev/null +++ b/gemmarat/src/video_widget.rs @@ -0,0 +1,31 @@ +use ratatui::prelude::*; +use ratatui::widgets::Paragraph; +use gemma::chip8::video::Chip8Video; + +pub struct VideoWidget { + video: Chip8Video +} + +impl VideoWidget { + pub fn new() -> Self { + VideoWidget { + video : Chip8Video::default() + } + } + + pub fn with_display(new_display: Chip8Video) -> Self { + VideoWidget { + video: new_display + } + } +} + +impl Widget for VideoWidget { + fn render(self, area: Rect, buf: &mut Buffer) { + let working_text = self.video.format_as_string(); + + //println!("WORKING_TEXT = {}", working_text); + let text = Paragraph::new(working_text); + Widget::render(text, area, buf); + } +} \ No newline at end of file diff --git a/gemmatelnet/Cargo.toml b/gemmatelnet/Cargo.toml index 9533577..e61cdbb 100644 --- a/gemmatelnet/Cargo.toml +++ b/gemmatelnet/Cargo.toml @@ -5,5 +5,6 @@ edition = "2024" [dependencies] gemma = { path = "../gemma" } -log = "0.4.22" -clap = { version = "4.5.20", features = ["derive"] } +pretty_env_logger.workspace = true +log.workspace = true +clap.workspace = true diff --git a/gemmautil/Cargo.toml b/gemmautil/Cargo.toml index 18d723b..b3eaa4e 100644 --- a/gemmautil/Cargo.toml +++ b/gemmautil/Cargo.toml @@ -8,3 +8,5 @@ gemma = { path = "../gemma" } clap.workspace = true pest = "2.7.14" pest_derive = "2.7.14" +pretty_env_logger.workspace = true +log.workspace = true