diff --git a/Cargo.lock b/Cargo.lock index 19db2a6..6d918b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -270,7 +270,7 @@ dependencies = [ [[package]] name = "dttyper" -version = "1.4.2" +version = "1.4.3" dependencies = [ "chrono", "crossterm", diff --git a/Cargo.toml b/Cargo.toml index b1e1eab..709ba76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "dttyper" description = "Terminal-based typing test." -version = "1.4.2" +version = "1.4.3" readme = "README.md" -repository = "https://git.berryez.xyz/berry/dttyper.git" -homepage = "https://git.berryez.xyz/berry/dttyper" +repository = "https://git.4o1x5.dev/4o1x5/dttyper.git" +homepage = "https://git.4o1x5.dev/4o1x5/dttyper" license = "MIT" authors = [ "Max Niederman ", - "berry ", + "4o1x5 <4o1x5@4o1x5.dev>", ] edition = "2021" diff --git a/flake.lock b/flake.lock index c69ace8..3dbc21a 100644 --- a/flake.lock +++ b/flake.lock @@ -1,119 +1,24 @@ { "nodes": { - "advisory-db": { - "flake": false, - "locked": { - "lastModified": 1711896428, - "narHash": "sha256-cZfXcw6dkd+00dOnD0tD/GLX7gEU/piVUF8SOKRIjf4=", - "owner": "rustsec", - "repo": "advisory-db", - "rev": "799ff4a10673405b2334f6653519fb092aa99845", - "type": "github" - }, - "original": { - "owner": "rustsec", - "repo": "advisory-db", - "type": "github" - } - }, - "crane": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1712015038, - "narHash": "sha256-opeWL/FPV7nnbfUavSWIDy+N5bUshF2CyJK6beVvjv4=", - "owner": "ipetkov", - "repo": "crane", - "rev": "b245ee3472cbfd82394047b536e117a32b4c7850", - "type": "github" - }, - "original": { - "owner": "ipetkov", - "repo": "crane", - "type": "github" - } - }, - "fenix": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ], - "rust-analyzer-src": [] - }, - "locked": { - "lastModified": 1712038998, - "narHash": "sha256-bVIEz07/SLxPRRo+1G0cUd26KhoCj8yQc8myhf/93FM=", - "owner": "nix-community", - "repo": "fenix", - "rev": "b1b59b4d908d3e64a7e923a7b434e94e03626ec0", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "fenix", - "type": "github" - } - }, - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "nixpkgs": { "locked": { - "lastModified": 1711715736, - "narHash": "sha256-9slQ609YqT9bT/MNX9+5k5jltL9zgpn36DpFB7TkttM=", + "lastModified": 1716948383, + "narHash": "sha256-SzDKxseEcHR5KzPXLwsemyTR/kaM9whxeiJohbL04rs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "807c549feabce7eddbf259dbdcec9e0600a0660d", + "rev": "ad57eef4ef0659193044870c731987a6df5cf56b", "type": "github" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" } }, "root": { "inputs": { - "advisory-db": "advisory-db", - "crane": "crane", - "fenix": "fenix", - "flake-utils": "flake-utils", "nixpkgs": "nixpkgs" } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 88c66ed..d66db88 100644 --- a/flake.nix +++ b/flake.nix @@ -1,134 +1,113 @@ { - description = "Build a cargo project"; + description = "romodoro builder"; - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + inputs.nixpkgs.url = "nixpkgs/nixos-unstable"; - crane = { - url = "github:ipetkov/crane"; - inputs.nixpkgs.follows = "nixpkgs"; - }; + outputs = { self, nixpkgs }: + let + supportedSystems = + [ + "x86_64-linux" + "x86_64-darwin" + "aarch64-linux" + "aarch64-darwin" + ]; - fenix = { - url = "github:nix-community/fenix"; - inputs.nixpkgs.follows = "nixpkgs"; - inputs.rust-analyzer-src.follows = ""; - }; + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; - flake-utils.url = "github:numtide/flake-utils"; - - advisory-db = { - url = "github:rustsec/advisory-db"; - flake = false; - }; - }; - - outputs = { self, nixpkgs, crane, fenix, flake-utils, advisory-db, ... }: - flake-utils.lib.eachDefaultSystem (system: - let - pkgs = nixpkgs.legacyPackages.${system}; - - inherit (pkgs) lib; - - craneLib = crane.lib.${system}; - src = craneLib.cleanCargoSource (craneLib.path ./.); - - # Common arguments can be set here to avoid repeating them later - commonArgs = { - inherit src; - strictDeps = true; - - buildInputs = [ - # Add additional build inputs here - ] ++ lib.optionals pkgs.stdenv.isDarwin [ - # Additional darwin specific inputs can be set here - pkgs.libiconv - ]; - - # Additional environment variables can be set directly - # MY_CUSTOM_VAR = "some value"; - }; - - craneLibLLvmTools = craneLib.overrideToolchain - (fenix.packages.${system}.complete.withComponents [ - "cargo" - "llvm-tools" - "rustc" - ]); - - # Build *just* the cargo dependencies, so we can reuse - # all of that work (e.g. via cachix) when running in CI - cargoArtifacts = craneLib.buildDepsOnly commonArgs; - - # Build the actual crate itself, reusing the dependency - # artifacts from above. - dttyper = craneLib.buildPackage (commonArgs // { - inherit cargoArtifacts; - }); - in - { - checks = { - # Build the crate as part of `nix flake check` for convenience - inherit dttyper; - - # Run clippy (and deny all warnings) on the crate source, - # again, reusing the dependency artifacts from above. - # - # Note that this is done as a separate derivation so that - # we can block the CI if there are issues here, but not - # prevent downstream consumers from building our crate by itself. - dttyper-clippy = craneLib.cargoClippy (commonArgs // { - inherit cargoArtifacts; - cargoClippyExtraArgs = "--all-targets -- --deny warnings"; - }); - - dttyper-doc = craneLib.cargoDoc (commonArgs // { - inherit cargoArtifacts; - }); - - # Check formatting - dttyper-fmt = craneLib.cargoFmt { - inherit src; - }; - - # Audit dependencies - dttyper-audit = craneLib.cargoAudit { - inherit src advisory-db; - }; - - # Audit licenses - dttyper-deny = craneLib.cargoDeny { - inherit src; - }; - - # Run tests with cargo-nextest - # Consider setting `doCheck = false` on `dttyper` if you do not want - # the tests to run twice - dttyper-nextest = craneLib.cargoNextest (commonArgs // { - inherit cargoArtifacts; - partitions = 1; - partitionType = "count"; - }); - }; - - packages = { - default = dttyper; - } // lib.optionalAttrs (!pkgs.stdenv.isDarwin) { - dttyper-llvm-coverage = craneLibLLvmTools.cargoLlvmCov (commonArgs // { - inherit cargoArtifacts; - }); - }; - - apps.default = flake-utils.lib.mkApp { - drv = dttyper; - }; - - devShells.default = craneLib.devShell { - checks = self.checks.${system}; - OPENSSL_NO_VENDOR = 1; - packages = [ - pkgs.openssl - ]; - }; + nixpkgsFor = forAllSystems (system: import nixpkgs { + inherit system; }); + + in + { + + packages = forAllSystems (system: + let + pkgs = nixpkgsFor.${system}; + in + { + default = pkgs.rustPlatform.buildRustPackage { + pname = "dttyper"; + version = "1.4.3"; + src = ./.; + + nativeBuildInputs = with pkgs; [ + libiconv + pkg-config + ]; + buildInputs = with pkgs; [ + openssl + ]; + cargoLock.lockFile = ./Cargo.lock; + }; + }); + + nixosModules.default = { config, lib, pkgs, ... }: + with lib; + let + cfg = config.services.prometheus.exporters.i2pd; + in + { + options.programs.dttyper = { + enable = mkEnableOption "Enable dttyper"; + + default_language = mkOption { + type = types.str; + default = "english1000"; + }; + server = mkOption { + type = types.str; + # TODO add checking for url in config + default = "http://localhost:8086"; + }; + token = mkOption { + type = types.str; + # TODO add tokeFile + }; + bucket = mkOption { + type = types.str; + default = "dttyper"; + }; + + org = mkOption { + type = types.str; + }; + + keyboard = mkOption { + type = types.str; + default = "Generic"; + }; + }; + + + config = mkIf cfg.enable { + # todo add variables to ~/.config/dttyper + }; + }; + + + + devShells.default = + with nixpkgs; mkShell + { + LIBCLANG_PATH = "${pkgs.llvmPackages_17.libclang.lib}/lib"; + RUST_BACKTRACE = 1; + RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; + OPENSSL_NO_VENDOR = 1; + packages = with pkgs; [ + rustc + cargo + rustfmt + rust-analyzer + clippy + rustup + pkg-config + openssl + libiconv + ]; + }; + }; } + + diff --git a/src/main.rs b/src/main.rs index d2c4532..ed7937b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -272,7 +272,9 @@ fn main() -> io::Result<()> { State::Test(ref mut test) => { if let Event::Key(key) = event { test.handle_key(key); + if test.complete { + // todo handle on another thread save_result( &Results::from(&*test), config.server.clone(), diff --git a/src/save.rs b/src/save.rs index 0147c5f..3e847bc 100644 --- a/src/save.rs +++ b/src/save.rs @@ -60,6 +60,7 @@ pub fn save_result( // building influxdb insert query let data = format!("test,language={},keyboard={} words={},incorrect_types={},correct_types={},wpm={},accuracy={},words_typed_correctly={},words_typed_incorrectly={} {}", language.replace('"', ""), + // TODO add keyboard instead of "generic" "generic", words_typed, words_typed_incorrectly.len(),