cassiopeia: adding new format lexer built on logos

wip/yesman
Katharina Fey 3 years ago
parent 585078cd7a
commit afd8a74e43
  1. 1
      apps/cassiopeia/.envrc
  2. 175
      apps/cassiopeia/Cargo.lock
  3. 3
      apps/cassiopeia/Cargo.toml
  4. 8
      apps/cassiopeia/shell.nix
  5. 116
      apps/cassiopeia/src/format/lexer.rs
  6. 3
      apps/cassiopeia/src/format/mod.rs
  7. 4
      apps/cassiopeia/src/main.rs

@ -0,0 +1 @@
eval "$(lorri direnv)"

@ -0,0 +1,175 @@
# 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 = "beef"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "474a626a67200bd107d44179bb3d4fc61891172d11696609264589be6a0e6a43"
[[package]]
name = "cassiopeia"
version = "0.1.0"
dependencies = [
"chrono",
"logos",
]
[[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",
"time",
"winapi",
]
[[package]]
name = "fnv"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "libc"
version = "0.2.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb"
[[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 = "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.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
dependencies = [
"proc-macro2",
]
[[package]]
name = "regex-syntax"
version = "0.6.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
[[package]]
name = "syn"
version = "1.0.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44"
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 = "utf8-ranges"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba"
[[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"

@ -5,4 +5,5 @@ authors = ["Mx Kookie <kookie@spacekookie.de>"]
edition = "2018"
[dependencies]
chrono = "*"
chrono = "*"
logos = "0.11"

@ -0,0 +1,8 @@
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "cassiopeia";
buildInputs = with pkgs; [
rustracer rustup clangStdenv
];
}

@ -0,0 +1,116 @@
//! Cassiopeia file lexer
use logos::Logos;
/// A basic line lexer type
///
/// This lexer distinguishes between comments, and keyword lines. It
/// does not attempt to parse the line specifics. This is what the
/// content lexer is for.
#[derive(Logos, Debug, PartialEq)]
enum Line {
#[token("HEADER")]
Header,
#[token("START")]
Start,
#[token("STOP")]
Stop,
#[token("INVOICE")]
Invoice,
#[regex(r"\w+=[^,$]+[,$]")]
HeaderData,
// FIXME: this will have a leading whitespace that we could remove
// with ^\w, but logos does not support this at the moment
#[regex(r"[0-9-:+ ]+")]
Date,
#[token(" ", logos::skip)]
Space,
#[error]
Error,
}
// pub fn test_this() {
// // let mut lex = Line::lexer("HEADER version=0.0.0,location=Berlin,");
// let mut lex = Line::lexer("START 2020-11-11 13:00:00+01:00");
// while let Some(t) = lex.next() {
// println!("{:?}: {}", t, lex.slice());
// }
// }
#[test]
fn basic_header() {
let mut lex = Line::lexer("HEADER version=0.0.0,location=Berlin Lichtenberg,");
assert_eq!(lex.next(), Some(Line::Header));
assert_eq!(lex.span(), 0..6);
assert_eq!(lex.slice(), "HEADER");
assert_eq!(lex.next(), Some(Line::HeaderData));
assert_eq!(lex.span(), 7..21);
assert_eq!(lex.slice(), "version=0.0.0,");
assert_eq!(lex.next(), Some(Line::HeaderData));
assert_eq!(lex.span(), 21..49);
assert_eq!(lex.slice(), "location=Berlin Lichtenberg,");
assert_eq!(lex.next(), None);
}
#[test]
fn basic_start() {
let mut lex = Line::lexer("START 2020-11-11 13:00:00+01:00");
assert_eq!(lex.next(), Some(Line::Start));
assert_eq!(lex.span(), 0..5);
assert_eq!(lex.slice(), "START");
assert_eq!(lex.next(), Some(Line::Date));
assert_eq!(lex.span(), 5..31);
assert_eq!(lex.slice(), " 2020-11-11 13:00:00+01:00");
assert_eq!(lex.next(), None);
}
#[test]
fn basic_stop() {
let mut lex = Line::lexer("STOP 2020-11-11 13:00:00+01:00");
assert_eq!(lex.next(), Some(Line::Stop));
assert_eq!(lex.span(), 0..4);
assert_eq!(lex.slice(), "STOP");
assert_eq!(lex.next(), Some(Line::Date));
assert_eq!(lex.span(), 4..30);
assert_eq!(lex.slice(), " 2020-11-11 13:00:00+01:00");
assert_eq!(lex.next(), None);
}
#[test]
fn basic_invoice() {
let mut lex = Line::lexer("INVOICE 2020-11-11 13:00:00+01:00");
assert_eq!(lex.next(), Some(Line::Invoice));
assert_eq!(lex.span(), 0..7);
assert_eq!(lex.slice(), "INVOICE");
assert_eq!(lex.next(), Some(Line::Date));
assert_eq!(lex.span(), 7..33);
assert_eq!(lex.slice(), " 2020-11-11 13:00:00+01:00");
assert_eq!(lex.next(), None);
}

@ -0,0 +1,3 @@
//! cassiopeia file format handling
pub(crate) mod lexer;

@ -1,3 +1,5 @@
mod format;
fn main() {
println!("Hello, world!");
}

Loading…
Cancel
Save