From f186a7345dfc99347673f46e0daff0cb63ac8492 Mon Sep 17 00:00:00 2001 From: Kaiden Fey Date: Sun, 21 Feb 2021 14:56:11 +0100 Subject: k-office: initial code dump --- apps/koffice/.gitignore | 1 + apps/koffice/Cargo.lock | 433 +++++++++++++++++++++++++++ apps/koffice/Cargo.toml | 5 + apps/koffice/README.md | 25 ++ apps/koffice/invoice/Cargo.toml | 13 + apps/koffice/invoice/src/base.rs | 20 ++ apps/koffice/invoice/src/cli.rs | 76 +++++ apps/koffice/invoice/src/main.rs | 41 +++ apps/koffice/invoice/src/pfile.rs | 33 ++ apps/koffice/libko/Cargo.lock | 189 ++++++++++++ apps/koffice/libko/Cargo.toml | 12 + apps/koffice/libko/src/cass/data.rs | 116 +++++++ apps/koffice/libko/src/cass/date.rs | 32 ++ apps/koffice/libko/src/cass/error.rs | 91 ++++++ apps/koffice/libko/src/cass/format/gen.rs | 32 ++ apps/koffice/libko/src/cass/format/ir.rs | 99 ++++++ apps/koffice/libko/src/cass/format/lexer.rs | 151 ++++++++++ apps/koffice/libko/src/cass/format/mod.rs | 76 +++++ apps/koffice/libko/src/cass/format/parser.rs | 73 +++++ apps/koffice/libko/src/cass/meta.rs | 46 +++ apps/koffice/libko/src/cass/mod.rs | 160 ++++++++++ apps/koffice/libko/src/cass/time.rs | 141 +++++++++ apps/koffice/libko/src/cass/timeline.rs | 132 ++++++++ apps/koffice/libko/src/client.rs | 39 +++ apps/koffice/libko/src/config.rs | 5 + apps/koffice/libko/src/invoice.rs | 35 +++ apps/koffice/libko/src/lib.rs | 35 +++ apps/koffice/libko/src/proj.rs | 15 + apps/koffice/libko/src/store.rs | 94 ++++++ apps/koffice/libko/src/timefile.rs | 0 30 files changed, 2220 insertions(+) create mode 100644 apps/koffice/.gitignore create mode 100644 apps/koffice/Cargo.lock create mode 100644 apps/koffice/Cargo.toml create mode 100644 apps/koffice/README.md create mode 100644 apps/koffice/invoice/Cargo.toml create mode 100644 apps/koffice/invoice/src/base.rs create mode 100644 apps/koffice/invoice/src/cli.rs create mode 100644 apps/koffice/invoice/src/main.rs create mode 100644 apps/koffice/invoice/src/pfile.rs create mode 100644 apps/koffice/libko/Cargo.lock create mode 100644 apps/koffice/libko/Cargo.toml create mode 100644 apps/koffice/libko/src/cass/data.rs create mode 100644 apps/koffice/libko/src/cass/date.rs create mode 100644 apps/koffice/libko/src/cass/error.rs create mode 100644 apps/koffice/libko/src/cass/format/gen.rs create mode 100644 apps/koffice/libko/src/cass/format/ir.rs create mode 100644 apps/koffice/libko/src/cass/format/lexer.rs create mode 100644 apps/koffice/libko/src/cass/format/mod.rs create mode 100644 apps/koffice/libko/src/cass/format/parser.rs create mode 100644 apps/koffice/libko/src/cass/meta.rs create mode 100644 apps/koffice/libko/src/cass/mod.rs create mode 100644 apps/koffice/libko/src/cass/time.rs create mode 100644 apps/koffice/libko/src/cass/timeline.rs create mode 100644 apps/koffice/libko/src/client.rs create mode 100644 apps/koffice/libko/src/config.rs create mode 100644 apps/koffice/libko/src/invoice.rs create mode 100644 apps/koffice/libko/src/lib.rs create mode 100644 apps/koffice/libko/src/proj.rs create mode 100644 apps/koffice/libko/src/store.rs create mode 100644 apps/koffice/libko/src/timefile.rs diff --git a/apps/koffice/.gitignore b/apps/koffice/.gitignore new file mode 100644 index 000000000000..eb5a316cbd19 --- /dev/null +++ b/apps/koffice/.gitignore @@ -0,0 +1 @@ +target diff --git a/apps/koffice/Cargo.lock b/apps/koffice/Cargo.lock new file mode 100644 index 000000000000..f79c22086be3 --- /dev/null +++ b/apps/koffice/Cargo.lock @@ -0,0 +1,433 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "beef" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "474a626a67200bd107d44179bb3d4fc61891172d11696609264589be6a0e6a43" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[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", + "time", + "winapi", +] + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "term_size", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "dtoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e" + +[[package]] +name = "env_logger" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17392a012ea30ef05a610aa97dfb49496e71c9f676b27879922ea5bdf60d9d3f" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "hermit-abi" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +dependencies = [ + "libc", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "invoice" +version = "0.2.0" +dependencies = [ + "chrono", + "clap", + "env_logger", + "libko", + "log", + "serde", +] + +[[package]] +name = "libc" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "libko" +version = "1.0.0" +dependencies = [ + "chrono", + "logos", + "serde", + "serde_yaml", + "xdg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "logos" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91c49573597a5d6c094f9031617bb1fed15c0db68c81e6546d313414ce107e4" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-derive" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "797b1f8a0571b331c1b47e7db245af3dc634838da7a92b3bef4e30376ae1c347" +dependencies = [ + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax", + "syn", + "utf8-ranges", +] + +[[package]] +name = "memchr" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" + +[[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 = "once_cell" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-syntax" +version = "0.6.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" + +[[package]] +name = "serde" +version = "1.0.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15654ed4ab61726bf918a39cb8d98a2e2995b002387807fa6ba58fdf7f59bb23" +dependencies = [ + "dtoa", + "linked-hash-map", + "serde", + "yaml-rust", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "syn" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "term_size" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "term_size", + "unicode-width", +] + +[[package]] +name = "thread_local" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +dependencies = [ + "once_cell", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "utf8-ranges" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[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-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[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 = "xdg" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/apps/koffice/Cargo.toml b/apps/koffice/Cargo.toml new file mode 100644 index 000000000000..4ff3f0a91819 --- /dev/null +++ b/apps/koffice/Cargo.toml @@ -0,0 +1,5 @@ +[workspace] +members = [ + "libko", + "invoice" +] \ No newline at end of file diff --git a/apps/koffice/README.md b/apps/koffice/README.md new file mode 100644 index 000000000000..2e37820450a6 --- /dev/null +++ b/apps/koffice/README.md @@ -0,0 +1,25 @@ +# k-office + +A set of plain-text, free software tools to run a small business. + + +## Set of tools + +Currently k-office consists of the following tools. A support library +`libko` provides the basic building blocks for other tools. + +- cassiopeia -- a plain-text time tracking tool +- invoice -- a LaTeX template based invoice generator + + +## How to build + +Build files for the whole suite are provided in [`nix/`](./nix/). You +can also build individual tools (e.g. to hack on) via Cargo. + + +## Contributions + +If you want to make suggestions, or send a patch in you can do so via +my public inbox. Either send the patches directly, or via a +request-pull! diff --git a/apps/koffice/invoice/Cargo.toml b/apps/koffice/invoice/Cargo.toml new file mode 100644 index 000000000000..15bb8e7e90c6 --- /dev/null +++ b/apps/koffice/invoice/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "invoice" +version = "0.2.0" +authors = ["Katharina Fey "] +edition = "2018" + +[dependencies] +chrono = { version = "0.4", features = [ "serde" ] } +clap = { version = "2.0", features = [ "wrap_help", "color", "suggestions" ] } +libko = { path = "../libko", version = "*" } +serde = { version = "1.0", features = [ "derive" ] } +env_logger = "0.8" +log = "0.4" \ No newline at end of file diff --git a/apps/koffice/invoice/src/base.rs b/apps/koffice/invoice/src/base.rs new file mode 100644 index 000000000000..a29af6480bf8 --- /dev/null +++ b/apps/koffice/invoice/src/base.rs @@ -0,0 +1,20 @@ +//! Basing application initialisation + +use libko::*; +use std::path::PathBuf; + +pub fn init(pid: Option<&str>, tf: Option<&str>, t: Option<&str>, rev: Option<&str>) -> Meta { + let mut meta = initialise(); + + meta.project_id = pid.map(Into::into); + + if let Some(tfpath) = tf { + meta.load_timefile(tfpath); + } + + if let Some(template) = t { + meta.template = Some(PathBuf::new().join(template)); + } + + dbg!(meta) +} diff --git a/apps/koffice/invoice/src/cli.rs b/apps/koffice/invoice/src/cli.rs new file mode 100644 index 000000000000..cbf27efe6cc4 --- /dev/null +++ b/apps/koffice/invoice/src/cli.rs @@ -0,0 +1,76 @@ +use crate::Meta; +use clap::{App, AppSettings, Arg, SubCommand}; + +pub struct AppState { + pub meta: Meta, + pub cmd: Command, +} + +pub enum Command { + Init, + Generate, + Install, +} + +pub fn parse() -> AppState { + let project_id = + Arg::with_name("project id").help("The project identifier. Format: [client/]"); + + let timefile = Arg::with_name("timefile") + .help("Location of the project's time file") + .takes_value(true) + .long("file") + .short("f") + .default_value("./time.cass"); + + let template = Arg::with_name("template") + .help("Override the default application template") + .long("templ") + .short("t") + .takes_value(true) + .default_value("$XDG_CONFIG_HOME/k-office/template.tex"); + + let revision = Arg::with_name("revision") + .help("Override the default revision system") + .long("rev") + .short("r") + .takes_value(true); + + let app = App::new("invoice") + .version(env!("CARGO_PKG_VERSION")) + .about("A k-office tool to generate and manage invoices") + .settings(&[ + AppSettings::SubcommandRequired, + AppSettings::GlobalVersion, + AppSettings::ColoredHelp, + AppSettings::DontCollapseArgsInUsage, + ]) + .subcommand( + SubCommand::with_name("init") + .about("Initialise a new invoice config") + .arg(timefile) + .arg(revision.clone()), + ) + .subcommand( + SubCommand::with_name("generate") + .about("Generate an invoice PDF for a client/ project based on a template") + .arg(revision) + .arg(template), + ); + + let matches = app.get_matches(); + + let project_id = matches.value_of("project id"); + let timefile = matches.value_of("timefile"); + let template = matches.value_of("template"); + let revision = matches.value_of("revision"); + + AppState { + meta: crate::base::init(project_id, timefile, template, revision), + cmd: match matches.subcommand() { + ("init", _) => Command::Init, + ("generate", _) => Command::Generate, + _ => unreachable!(), + }, + } +} diff --git a/apps/koffice/invoice/src/main.rs b/apps/koffice/invoice/src/main.rs new file mode 100644 index 000000000000..742b74be0b0a --- /dev/null +++ b/apps/koffice/invoice/src/main.rs @@ -0,0 +1,41 @@ + +mod base; +mod cli; +mod pfile; + +pub(crate) use base::*; +pub(crate) use cli::*; +pub(crate) use pfile::*; + +use libko::*; +use std::{io::Write, fs::OpenOptions as Oo}; + +fn main() { + let AppState { meta, cmd } = cli::parse(); + + match cmd { + Command::Init => init(meta), + Command::Generate => generate(meta), + Command::Install => todo!(), + } +} + +fn init(meta: Meta) { + let pid = meta.project_id.as_ref().unwrap_or_else(|| { + meta.timefile + .as_ref() + .expect("No project id given, with no timefile available") + .client() + .as_ref() + .unwrap() + }); + + let path = meta.invoice_dir.join(pid); + let mut f = Oo::new().write(true).truncate(true).open(path).unwrap(); + f.write_all(pfile::data_templ().as_bytes()).unwrap(); + + // let pid = meta.project_id.as_ref().unwrap_or_else(|| + // let f = meta.invoice_dir.join(meta.project_id); +} + +fn generate(meta: Meta) {} diff --git a/apps/koffice/invoice/src/pfile.rs b/apps/koffice/invoice/src/pfile.rs new file mode 100644 index 000000000000..ec99e5ab3049 --- /dev/null +++ b/apps/koffice/invoice/src/pfile.rs @@ -0,0 +1,33 @@ +use crate::{Account, Address, Worker, InvoiceId}; +use chrono::NaiveDate; +use serde::{Serialize, Deserialize}; + +/// Describes invoice metadata +#[derive(Serialize, Deserialize)] +pub struct InvoiceFile { + invoice_id: InvoiceId, + date: NaiveDate, + author: Worker, + account: Account, + client: Address, + vat: u8, + service: Vec, + currency: String, + lang: String, +} + +/// A service description +#[derive(Serialize, Deserialize)] +pub enum ServiceEntry { + Line(String), + Hash { + description: String, + price: usize, + details: Vec, + } +} + +pub fn data_templ() -> String { + + todo!() +} diff --git a/apps/koffice/libko/Cargo.lock b/apps/koffice/libko/Cargo.lock new file mode 100644 index 000000000000..bcc14cca627a --- /dev/null +++ b/apps/koffice/libko/Cargo.lock @@ -0,0 +1,189 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[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", + "time", + "winapi", +] + +[[package]] +name = "dtoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e" + +[[package]] +name = "libc" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "libko" +version = "0.1.0" +dependencies = [ + "chrono", + "serde", + "serde_yaml", + "xdg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[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 = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15654ed4ab61726bf918a39cb8d98a2e2995b002387807fa6ba58fdf7f59bb23" +dependencies = [ + "dtoa", + "linked-hash-map", + "serde", + "yaml-rust", +] + +[[package]] +name = "syn" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[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 = "xdg" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/apps/koffice/libko/Cargo.toml b/apps/koffice/libko/Cargo.toml new file mode 100644 index 000000000000..44a62071c07d --- /dev/null +++ b/apps/koffice/libko/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "libko" +version = "1.0.0" +authors = ["Katharina Fey "] +edition = "2018" + +[dependencies] +chrono = { version = "0.4", features = [ "serde" ] } +serde = { version = "1.0", features = [ "derive" ] } +serde_yaml = "*" +xdg = "2.2.0" +logos = "0.11" \ No newline at end of file diff --git a/apps/koffice/libko/src/cass/data.rs b/apps/koffice/libko/src/cass/data.rs new file mode 100644 index 000000000000..4ff4dc93020e --- /dev/null +++ b/apps/koffice/libko/src/cass/data.rs @@ -0,0 +1,116 @@ +//! Typed time file for cassiopeia +//! +//! This data gets generated by the `format` module, and can later be +//! used to generate new files, and perform various lookups and +//! analysis tasks. + +use crate::cass::{ + error::{ParseError, ParseResult, UserResult}, + format::ir::{IrItem, IrType, MakeIr}, + timeline::{Entry, Timeline}, + Date, Time, +}; +use chrono::{DateTime, Duration, FixedOffset as Offset, Local, NaiveDate}; +use std::collections::BTreeMap; + +#[derive(Clone, Debug, Default)] +pub struct TimeFile { + /// A parsed header structure + pub(crate) header: BTreeMap, + /// A parsed timeline of events + pub(crate) timeline: Timeline, +} + +impl TimeFile { + pub fn project(&self) -> Option<&String> { + self.header.get("project") + } + + pub fn client(&self) -> Option<&String> { + self.header.get("client") + } + + /// Append entries to the timeline from the parsed IR + /// + /// Report any errors that occur back to the parser, that will + /// print a message to the user and terminate the program. + pub(crate) fn append(&mut self, line: IrItem) -> ParseResult<()> { + match line { + IrItem { + tt: IrType::Header(ref header), + .. + } => Ok(header.iter().for_each(|(k, v)| { + self.header.insert(k.clone(), v.clone()); + })), + IrItem { + tt: IrType::Start(time), + lo, + } => Ok(self.timeline.start(time).map(|_| ())?), + IrItem { + tt: IrType::Stop(time), + lo, + } => Ok(self.timeline.stop(time).map(|_| ())?), + IrItem { + tt: IrType::Invoice(date), + lo, + } => Ok(self.timeline.invoice(date).map(|_| ())?), + _ => Err(ParseError::Unknown), + } + } +} + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Session { + start: Time, + stop: Option