summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Cargo.lock113
-rw-r--r--Cargo.toml11
-rw-r--r--src/journal.rs41
-rw-r--r--src/main.rs11
-rw-r--r--src/parser.rs124
6 files changed, 301 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..c30c4e2
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,113 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "either"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
+
+[[package]]
+name = "itertools"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rlg"
+version = "0.1.0"
+dependencies = [
+ "itertools",
+ "time",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "time"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcb8742444475438c500d017736dd7cf3d9c9dd1f0153cfa4af428692484e3ef"
+dependencies = [
+ "rustversion",
+ "time-macros",
+]
+
+[[package]]
+name = "time-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ae9b6e9f095bc105e183e3cd493d72579be3181ad4004fceb01adbe9eecab2d"
+dependencies = [
+ "proc-macro-hack",
+ "time-macros-impl",
+]
+
+[[package]]
+name = "time-macros-impl"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e987cfe0537f575b5fc99909de6185f6c19c3ad8889e2275e686a873d0869ba1"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..5afadfb
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "rlg"
+version = "0.1.0"
+authors = ["naopross"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+time = "0.2"
+itertools = "0.8"
diff --git a/src/journal.rs b/src/journal.rs
new file mode 100644
index 0000000..d608bd0
--- /dev/null
+++ b/src/journal.rs
@@ -0,0 +1,41 @@
+#[allow(dead_code)]
+pub struct Commodity {
+ name: String,
+}
+
+#[allow(dead_code)]
+pub struct Account {
+ name: String,
+ commodity: Commodity,
+}
+
+#[allow(dead_code)]
+pub struct Posting {
+ account: Account,
+ amount: i64,
+ commodity: Commodity,
+}
+
+#[allow(dead_code)]
+pub struct Transaction {
+ text: String,
+ payee: String,
+ postings: Vec<Posting>,
+}
+
+#[allow(dead_code)]
+pub struct Journal {
+ pub commodities: Vec<Commodity>,
+ pub accounts: Vec<Account>,
+ pub transactions: Vec<Transaction>,
+}
+
+
+
+impl Commodity {
+ fn new(name: &str) -> Commodity {
+ Commodity {
+ name: name.to_string()
+ }
+ }
+}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..884cbe5
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,11 @@
+mod journal;
+mod parser;
+
+use std::env;
+
+
+fn main() {
+ if let Some(fname) = env::args().nth(1) {
+ parser::parse(&fname);
+ }
+}
diff --git a/src/parser.rs b/src/parser.rs
new file mode 100644
index 0000000..c57fe14
--- /dev/null
+++ b/src/parser.rs
@@ -0,0 +1,124 @@
+use crate::journal::Journal;
+
+use std::fs;
+use std::iter::Peekable;
+
+extern crate itertools;
+extern crate time;
+
+use itertools::Itertools;
+use time::Date;
+
+
+#[derive(Debug, Eq, PartialEq, Clone)]
+pub enum Token {
+ Word(String),
+ DateSep,
+ AccountSep,
+ DecimalSep,
+ Newline,
+ Space,
+ Indent,
+ Marker(char),
+ Comment(char),
+ Numeric(String),
+}
+
+pub struct Lexer<I: Iterator<Item=char>> {
+ iter: Peekable<I>
+}
+
+impl<I: Iterator<Item=char>> Lexer<I> {
+ pub fn new(iter: I) -> Lexer<I> {
+ Lexer {
+ iter: iter.peekable()
+ }
+ }
+}
+
+impl<I: Iterator<Item=char>> Iterator for Lexer<I> {
+ type Item = Token;
+
+ fn next(&mut self) -> Option<Token> {
+ // let ch = *self.iter.peek().unwrap_or(&'`');
+ let ch = self.iter.peek()
+ match ch {
+ /* alphanumeric */
+ c if c.is_alphabetic() => {
+ Some(Token::Word(self.iter.by_ref()
+ .peeking_take_while(|&c| c.is_alphabetic()).collect())) },
+ c if c.is_numeric() => {
+ Some(Token::Numeric(self.iter.by_ref()
+ .peeking_take_while(|&c| c.is_numeric()).collect()))
+ },
+ /* whitespace */
+ ' ' => {
+ self.iter.next();
+ Some(Token::Space)
+ },
+ '\n' => {
+ self.iter.next();
+ Some(Token::Newline)
+ },
+ '\t' => {
+ self.iter.next();
+ Some(Token::Indent)
+ },
+ /* separators */
+ '/' => {
+ self.iter.next();
+ Some(Token::DateSep)
+ },
+ ':' => {
+ self.iter.next();
+ Some(Token::AccountSep)
+ },
+ ',' | '.' => {
+ self.iter.next();
+ Some(Token::DecimalSep)
+ },
+ /* comments */
+ ';' | '#' | '%' => {
+ self.iter.next();
+ Some(Token::Comment(ch))
+ },
+ /* markers */
+ '*' | '!' | '@' | '-' => {
+ self.iter.next();
+ Some(Token::Marker(ch))
+ },
+ '`' => {
+ println!("--");
+ None
+ },
+ _ => self.next(),
+ }
+ }
+}
+
+
+pub fn lex(text: &str) -> Vec<Token> {
+ Lexer::new(text.chars()).collect()
+}
+
+
+
+struct Parser {
+
+}
+
+pub fn parse(name: &str) -> Journal {
+ let text = fs::read_to_string(name).expect("Cannot open file");
+
+ println!("{:?}", text);
+
+ for token in lex(&text) {
+ println!("{:?}", token);
+ }
+
+ Journal {
+ accounts: vec![],
+ commodities: vec![],
+ transactions: vec![],
+ }
+}