parent
585078cd7a
commit
afd8a74e43
@ -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" |
@ -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…
Reference in new issue