diff --git a/Cargo.lock b/Cargo.lock index b26b1f9..3c80bee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -217,6 +217,72 @@ dependencies = [ "syn", ] +[[package]] +name = "darling" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0808e1bd8671fb44a113a14e13497557533369847788fa2ae912b6ebfce9fa8" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "001d80444f28e193f30c2f293455da62dcf9a6b29918a4253152ae2b1de592cb" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b36230598a2d5de7ec1c6f51f72d8a99a9208daff41de2084d06e3fd3ea56685" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derive_builder" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" +dependencies = [ + "derive_builder_core", + "syn", +] + [[package]] name = "errno" version = "0.2.8" @@ -238,6 +304,12 @@ dependencies = [ "libc", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "futures" version = "0.3.25" @@ -372,6 +444,12 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "io-lifetimes" version = "1.0.3" @@ -443,6 +521,7 @@ dependencies = [ "anyhow", "chrono", "clap", + "derive_builder", "futures", "libc", "log", diff --git a/Cargo.toml b/Cargo.toml index 99886e1..8fa7f83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" anyhow = { version = "1.0.68", features = ["backtrace"] } chrono = "0.4.23" clap = { version = "4.0.32", features = ["derive"] } +derive_builder = "0.12.0" futures = "0.3.25" libc = "0.2.139" log = "0.4.17" diff --git a/flake.nix b/flake.nix index 059f5f0..3a2e9dc 100644 --- a/flake.nix +++ b/flake.nix @@ -9,7 +9,7 @@ overlays = [ fenix.overlays.default ]; }; - toolchain = pkgs.fenix.stable; + toolchain = pkgs.fenix.default; flakePkgs = { asciinema = pkgs.callPackage ./. { inherit toolchain; }; @@ -26,10 +26,11 @@ cargo-watch cargo-deny cargo-edit + cargo-expand # Get the nightly version of rustfmt so we can wrap comments pkgs.fenix.default.rustfmt - ]) ++ (with toolchain; [ cargo rustc rustfmt ]); + ]) ++ (with toolchain; [ cargo clippy rustc rustfmt ]); }; }); } diff --git a/src/asciicast.rs b/src/asciicast.rs index 55c4192..9e96eac 100644 --- a/src/asciicast.rs +++ b/src/asciicast.rs @@ -6,22 +6,39 @@ use std::collections::HashMap; use serde::ser::{Serialize, SerializeSeq, Serializer}; -#[derive(Serialize)] +#[derive(Debug, Builder, Serialize)] pub struct Header { - pub version: u32, + #[builder(setter(skip))] + pub version: Version, pub width: u32, pub height: u32, + #[builder(setter(strip_option), default)] pub timestamp: Option, + #[builder(setter(strip_option), default)] pub duration: Option, + #[builder(setter(strip_option), default)] pub idle_time_limit: Option, + #[builder(setter(into, strip_option), default)] pub command: Option, + #[builder(setter(into, strip_option), default)] pub title: Option, + #[builder(setter(into, strip_option), default)] pub env: Option>, + #[builder(setter(strip_option), default)] pub theme: Option, } -#[derive(Serialize)] +#[derive(Debug, Clone, Copy, Serialize)] +pub struct Version(u32); + +impl Default for Version { + fn default() -> Self { + Version(2) + } +} + +#[derive(Debug, Clone, Serialize)] pub struct Theme { fg: String, bg: String, @@ -55,19 +72,3 @@ impl Serialize for Event { seq.end() } } - -fn build_header(width: u32, height: u32) -> Header { - Header { - version: 2, - width, - height, - - timestamp: None, - duration: None, - idle_time_limit: None, - command: None, - title: None, - env: None, - theme: None, - } -} diff --git a/src/client/recorder.rs b/src/client/recorder.rs index 7e2ca9c..f85038d 100644 --- a/src/client/recorder.rs +++ b/src/client/recorder.rs @@ -1,8 +1,8 @@ //! Setting up a recorder +use std::collections::HashMap; use std::fs::File; use std::io::Write; - use std::path::PathBuf; use std::process::Command; @@ -10,7 +10,7 @@ use std::thread; use anyhow::Result; -use crate::asciicast::Header; +use crate::asciicast::HeaderBuilder; use super::terminal::Terminal; @@ -29,7 +29,7 @@ pub fn record(opts: RecordOpts) -> Result<()> { // Write header // TODO: Clean this up let header = { - let command_str = format!("{:?}", command); + let command_str = format!("{command:?}"); let env = command .get_envs() .into_iter() @@ -40,20 +40,14 @@ pub fn record(opts: RecordOpts) -> Result<()> { b.to_string_lossy().to_string(), ) }) - .collect(); - Header { - version: 2, - width: 30, - height: 30, + .collect::>(); - timestamp: None, - duration: None, - idle_time_limit: None, - command: Some(command_str), - title: None, - env: Some(env), - theme: None, - } + HeaderBuilder::default() + .width(30) + .height(30) + .command(command_str) + .env(env) + .build()? }; serde_json::to_writer(&file, &header)?; diff --git a/src/lib.rs b/src/lib.rs index c0a9508..9e527ca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,8 @@ extern crate anyhow; #[macro_use] extern crate clap; #[macro_use] +extern crate derive_builder; +#[macro_use] extern crate serde_derive; #[macro_use] extern crate tracing; diff --git a/src/main.rs b/src/main.rs index 6965ad6..05a224a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,3 @@ -#[macro_use] -extern crate tracing; - use anyhow::Result; use clap::{ArgAction, Parser}; use liveterm::client::recorder::{record, RecordOpts};