initial code

fogti
Oct 11, 2021, 8:14 PM
WU6CLCANMTMBB3BGGL4XYKPKI3JRPTDOJ3GTUEGZLA3WIWUPJJIQC

Dependencies

Change contents

  • file addition: crates (d--r------)
    [1.0]
  • file addition: zs-utilinv-terminal (d--r------)
    [0.18]
  • file addition: src (d--r------)
    [0.50]
  • file addition: lib.rs (----------)
    [0.66]
    use std::{cell::RefCell, fs::File, fs::OpenOptions, io::BufWriter, io::Write};
    use termion::{input::MouseTerminal, raw::RawTerminal, screen::AlternateScreen};
    pub struct Terminal {
    pub inpevs: termion::input::Events<File>,
    pub outp: RefCell<AlternateScreen<MouseTerminal<RawTerminal<BufWriter<File>>>>>,
    }
    /// Set the given file to be read in non-blocking mode. That is, attempting a
    /// read on the given file may return 0 bytes.
    ///
    /// Copied from private function at https://docs.rs/nonblock/0.1.0/nonblock/.
    ///
    /// The MIT License (MIT)
    ///
    /// Copyright (c) 2016 Anthony Nowell
    ///
    /// Permission is hereby granted, free of charge, to any person obtaining a copy
    /// of this software and associated documentation files (the "Software"), to deal
    /// in the Software without restriction, including without limitation the rights
    /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    /// copies of the Software, and to permit persons to whom the Software is
    /// furnished to do so, subject to the following conditions:
    ///
    /// The above copyright notice and this permission notice shall be included in all
    /// copies or substantial portions of the Software.
    ///
    /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    /// SOFTWARE.
    #[cfg(unix)]
    fn set_blocking(file: &File, blocking: bool) -> std::io::Result<()> {
    use libc::{fcntl, F_GETFL, F_SETFL, O_NONBLOCK};
    use std::os::unix::io::AsRawFd;
    let fd = file.as_raw_fd();
    let flags = unsafe { fcntl(fd, F_GETFL, 0) };
    if flags < 0 {
    return Err(std::io::Error::last_os_error());
    }
    let flags = if blocking {
    flags & !O_NONBLOCK
    } else {
    flags | O_NONBLOCK
    };
    let res = unsafe { fcntl(fd, F_SETFL, flags) };
    if res != 0 {
    return Err(std::io::Error::last_os_error());
    }
    Ok(())
    }
    impl Terminal {
    pub fn try_new() -> std::io::Result<Self> {
    use termion::{input::TermRead, raw::IntoRawMode};
    let term_out = OpenOptions::new().write(true).open("/dev/tty")?;
    let term_in = OpenOptions::new().read(true).open("/dev/tty")?;
    set_blocking(&term_in, false)?;
    let inpevs = term_in.events();
    let outp = RefCell::new(AlternateScreen::from(MouseTerminal::from(
    BufWriter::with_capacity(8_388_608, term_out).into_raw_mode()?,
    )));
    Ok(Self { inpevs, outp })
    }
    pub fn rewrite_line(&self, s: &str) -> std::io::Result<()> {
    let mut x = self.outp.borrow_mut();
    write!(&mut x, "\r{}{}", s, termion::clear::UntilNewline)?;
    x.flush()?;
    Ok(())
    }
    pub fn finish(self) -> std::io::Result<()> {
    let mut x = self.outp.borrow_mut();
    write!(self.outp.borrow_mut(), "\n")?;
    x.flush()?;
    Ok(())
    }
    }
  • file addition: Cargo.toml (----------)
    [0.50]
    [package]
    name = "zs-utilinv-terminal"
    version = "0.1.0"
    edition = "2018"
    license = "Apache-2.0"
    [dependencies]
    libc = "0.2"
    termion = "1.5"
  • file addition: zs-utilinv-core (d--r------)
    [0.18]
  • file addition: src (d--r------)
    [0.3528]
  • file addition: lib.rs (----------)
    [0.3544]
    pub mod countermeter;
  • file addition: countermeter.rs (----------)
    [0.3544]
    use chrono::NaiveDate;
    use serde::{Deserialize, Serialize};
    use std::path::{Path, PathBuf};
    pub type FixpNum = fixed::types::U54F10;
    #[derive(Debug, thiserror::Error)]
    pub enum Error {
    #[error("CSV error: {0:?}")]
    Csv(#[from] csv::Error),
    #[error("CSV into_inner/flush error: {}", .0.error())]
    CsvIntoInner(#[from] csv::IntoInnerError<csv::Writer<tempfile::NamedTempFile>>),
    #[error("persist error: {}", .0.error)]
    Persist(#[from] tempfile::PersistError),
    }
    #[derive(Debug, Deserialize, Serialize, PartialEq)]
    pub struct LogEntry {
    /// we don't expect that we would need to convert this data-set to a
    /// different time zone
    pub date: NaiveDate,
    pub cmd: LogCommand,
    pub value: Option<FixpNum>,
    /// may be empty
    pub comment: String,
    }
    #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
    pub enum LogCommand {
    /// meter broke, value approximated
    #[serde(rename = "brk")]
    Broken,
    /// indicate that the meter/counter value was reset
    #[serde(rename = "rst")]
    Reset,
    /// this assumes a monotonic increase
    #[serde(rename = "inc")]
    Increase,
    /// this assumes a monotonic decrease, e.g. for (accidentially) reversed counters
    #[serde(rename = "dec")]
    Decrease,
    }
    const METER_LEXT: &str = "metercsv";
    fn get_meter_path(base: &Path, name: &str) -> PathBuf {
    let mut path = base.join(name);
    path.set_extension(METER_LEXT);
    path
    }
    pub fn parse_logdata(bpath: &Path, name: &str) -> Result<Vec<LogEntry>, Error> {
    csv::ReaderBuilder::new()
    .delimiter(0x1f)
    .from_path(get_meter_path(bpath, name))?
    .deserialize()
    .map(|i| i.map_err(Into::into))
    .collect()
    }
    pub fn write_logdata(bpath: &Path, name: &str, data: &[LogEntry]) -> Result<(), Error> {
    use std::io::Write;
    let f = tempfile::NamedTempFile::new_in(bpath).map_err(csv::Error::from)?;
    let path = get_meter_path(bpath, name);
    let mut f = csv::WriterBuilder::new().delimiter(0x1f).from_writer(f);
    for i in data {
    f.serialize(i)?;
    }
    // get the NamedTempFile back
    let mut f = f.into_inner()?;
    f.flush().map_err(csv::Error::from)?;
    f.persist(path)?;
    Ok(())
    }
    #[cfg(test)]
    mod tests {
    use super::*;
    #[test]
    fn paths() {
    assert_eq!(
    get_meter_path(Path::new("../meters"), "whubbs"),
    PathBuf::from("../meters/whubbs.metercsv")
    );
    }
    #[test]
    fn basic() {
    let dir = tempfile::tempdir().expect("unable to create temporary directory");
    let data = vec![
    LogEntry {
    date: NaiveDate::from_ymd(2021, 10, 10),
    cmd: LogCommand::Reset,
    value: None,
    comment: "it starts happening\"!!".to_string(),
    },
    LogEntry {
    date: NaiveDate::from_ymd(2021, 10, 10),
    cmd: LogCommand::Increase,
    value: Some(fixed_macro::fixed!(0.010: U54F10)),
    comment: String::new(),
    },
    LogEntry {
    date: NaiveDate::from_ymd(2021, 10, 11),
    cmd: LogCommand::Increase,
    value: Some(fixed_macro::fixed!(0.011: U54F10)),
    comment: String::new(),
    },
    LogEntry {
    date: NaiveDate::from_ymd(2021, 10, 11),
    cmd: LogCommand::Broken,
    value: Some(fixed_macro::fixed!(0.012: U54F10)),
    comment: "water damage, ouch...".to_string(),
    },
    LogEntry {
    date: NaiveDate::from_ymd(2021, 10, 12),
    cmd: LogCommand::Decrease,
    value: Some(fixed_macro::fixed!(0.010: U54F10)),
    comment: String::new(),
    },
    ];
    write_logdata(dir.path(), "basic-countermeter-test", &data[..])
    .expect("unable to write data");
    {
    // compare serialization output directly
    let datv = std::fs::read(get_meter_path(dir.path(), "basic-countermeter-test"))
    .expect("unable to read data (1)");
    assert_eq!(
    std::str::from_utf8(&datv[..]).expect("utf8?"),
    r#"datecmdvaluecomment
    2021-10-10rst"it starts happening""!!"
    2021-10-10inc0.01
    2021-10-11inc0.011
    2021-10-11brk0.012water damage, ouch...
    2021-10-12dec0.01
    "#
    );
    }
    assert_eq!(
    data,
    parse_logdata(dir.path(), "basic-countermeter-test").expect("unable to read data (2)")
    );
    }
    }
  • file addition: Cargo.toml (----------)
    [0.3528]
    [package]
    name = "zs-utilinv-core"
    version = "0.1.0"
    edition = "2018"
    license = "Apache-2.0"
    [dependencies]
    csv = "1.1"
    tempfile = "3.2"
    thiserror = "1.0"
    [dependencies.chrono]
    version = "0.4"
    features = ["clock", "std", "serde"]
    default-features = false
    [dependencies.fixed]
    version = "1.10"
    features = ["serde", "serde-str"]
    [dependencies.serde]
    version = "1.0"
    features = ["derive"]
    [dev-dependencies]
    fixed-macro = "1.1"
  • file addition: Cargo.toml (----------)
    [1.0]
    [workspace]
    members = ["crates/*"]
  • file addition: Cargo.lock (----------)
    [1.0]
    # This file is automatically @generated by Cargo.
    # It is not intended for manual editing.
    version = 3
    [[package]]
    name = "autocfg"
    version = "1.0.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
    [[package]]
    name = "az"
    version = "1.1.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9d6dff4a1892b54d70af377bf7a17064192e822865791d812957f21e3108c325"
    [[package]]
    name = "bitflags"
    version = "1.3.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
    [[package]]
    name = "bstr"
    version = "0.2.17"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
    dependencies = [
    "lazy_static",
    "memchr",
    "regex-automata",
    "serde",
    ]
    [[package]]
    name = "bytemuck"
    version = "1.7.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "72957246c41db82b8ef88a5486143830adeb8227ef9837740bdec67724cf2c5b"
    [[package]]
    name = "cfg-if"
    version = "1.0.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
    [[package]]
    name = "chrono"
    version = "0.4.19"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
    dependencies = [
    "libc",
    "num-integer",
    "num-traits",
    "serde",
    "winapi",
    ]
    [[package]]
    name = "csv"
    version = "1.1.6"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1"
    dependencies = [
    "bstr",
    "csv-core",
    "itoa",
    "ryu",
    "serde",
    ]
    [[package]]
    name = "csv-core"
    version = "0.1.10"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
    dependencies = [
    "memchr",
    ]
    [[package]]
    name = "fixed"
    version = "1.10.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6d333a26ec13a023c6dff4b7584de4d323cfee2e508f5dd2bbee6669e4f7efdf"
    dependencies = [
    "az",
    "bytemuck",
    "half",
    "serde",
    "typenum",
    ]
    [[package]]
    name = "fixed-macro"
    version = "1.1.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3f6b2cae66e4989f93364a38a59a12e1830afe3201c7c11e5ea8727534831fbe"
    dependencies = [
    "fixed",
    "fixed-macro-impl",
    "fixed-macro-types",
    ]
    [[package]]
    name = "fixed-macro-impl"
    version = "1.1.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "787fa8e0bf88449e84799f4b440a15bd1958c4552a80abc568d5ba9e20a4283e"
    dependencies = [
    "fixed",
    "paste",
    "proc-macro-error",
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "fixed-macro-types"
    version = "1.1.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "13c7241f3a037641b460153db21d5611c789e7e0504bf52e20a9b4bbe1d7cc00"
    dependencies = [
    "fixed",
    "fixed-macro-impl",
    ]
    [[package]]
    name = "getrandom"
    version = "0.2.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
    dependencies = [
    "cfg-if",
    "libc",
    "wasi",
    ]
    [[package]]
    name = "half"
    version = "1.7.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "62aca2aba2d62b4a7f5b33f3712cb1b0692779a56fb510499d5c0aa594daeaf3"
    [[package]]
    name = "itoa"
    version = "0.4.8"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
    [[package]]
    name = "lazy_static"
    version = "1.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
    [[package]]
    name = "libc"
    version = "0.2.103"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6"
    [[package]]
    name = "memchr"
    version = "2.4.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
    [[package]]
    name = "num-integer"
    version = "0.1.44"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
    dependencies = [
    "autocfg",
    "num-traits",
    ]
    [[package]]
    name = "num-traits"
    version = "0.2.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
    dependencies = [
    "autocfg",
    ]
    [[package]]
    name = "numtoa"
    version = "0.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
    [[package]]
    name = "paste"
    version = "1.0.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58"
    [[package]]
    name = "ppv-lite86"
    version = "0.2.10"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
    [[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.29"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d"
    dependencies = [
    "unicode-xid",
    ]
    [[package]]
    name = "quote"
    version = "1.0.10"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
    dependencies = [
    "proc-macro2",
    ]
    [[package]]
    name = "rand"
    version = "0.8.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
    dependencies = [
    "libc",
    "rand_chacha",
    "rand_core",
    "rand_hc",
    ]
    [[package]]
    name = "rand_chacha"
    version = "0.3.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
    dependencies = [
    "ppv-lite86",
    "rand_core",
    ]
    [[package]]
    name = "rand_core"
    version = "0.6.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
    dependencies = [
    "getrandom",
    ]
    [[package]]
    name = "rand_hc"
    version = "0.3.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
    dependencies = [
    "rand_core",
    ]
    [[package]]
    name = "redox_syscall"
    version = "0.2.10"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
    dependencies = [
    "bitflags",
    ]
    [[package]]
    name = "redox_termios"
    version = "0.1.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f"
    dependencies = [
    "redox_syscall",
    ]
    [[package]]
    name = "regex-automata"
    version = "0.1.10"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
    [[package]]
    name = "remove_dir_all"
    version = "0.5.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
    dependencies = [
    "winapi",
    ]
    [[package]]
    name = "ryu"
    version = "1.0.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
    [[package]]
    name = "serde"
    version = "1.0.130"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913"
    dependencies = [
    "serde_derive",
    ]
    [[package]]
    name = "serde_derive"
    version = "1.0.130"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "syn"
    version = "1.0.80"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194"
    dependencies = [
    "proc-macro2",
    "quote",
    "unicode-xid",
    ]
    [[package]]
    name = "tempfile"
    version = "3.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
    dependencies = [
    "cfg-if",
    "libc",
    "rand",
    "redox_syscall",
    "remove_dir_all",
    "winapi",
    ]
    [[package]]
    name = "termion"
    version = "1.5.6"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "077185e2eac69c3f8379a4298e1e07cd36beb962290d4a51199acf0fdc10607e"
    dependencies = [
    "libc",
    "numtoa",
    "redox_syscall",
    "redox_termios",
    ]
    [[package]]
    name = "thiserror"
    version = "1.0.30"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417"
    dependencies = [
    "thiserror-impl",
    ]
    [[package]]
    name = "thiserror-impl"
    version = "1.0.30"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "typenum"
    version = "1.14.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec"
    [[package]]
    name = "unicode-xid"
    version = "0.2.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
    [[package]]
    name = "version_check"
    version = "0.9.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
    [[package]]
    name = "wasi"
    version = "0.10.2+wasi-snapshot-preview1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
    [[package]]
    name = "winapi"
    version = "0.3.9"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
    dependencies = [
    "winapi-i686-pc-windows-gnu",
    "winapi-x86_64-pc-windows-gnu",
    ]
    [[package]]
    name = "winapi-i686-pc-windows-gnu"
    version = "0.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
    [[package]]
    name = "winapi-x86_64-pc-windows-gnu"
    version = "0.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
    [[package]]
    name = "zs-utilinv-core"
    version = "0.1.0"
    dependencies = [
    "chrono",
    "csv",
    "fixed",
    "fixed-macro",
    "serde",
    "tempfile",
    "thiserror",
    ]
    [[package]]
    name = "zs-utilinv-terminal"
    version = "0.1.0"
    dependencies = [
    "libc",
    "termion",
    ]
  • file addition: .ignore (----------)
    [1.0]
    /target
    /result
    /result-*