Guest User

Untitled

a guest
May 21st, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. use regex::Regex;
  2. use std::fs::File;
  3. use std::io::BufRead;
  4. use std::io::BufReader;
  5. use std::io::Result;
  6. use std::path::PathBuf;
  7.  
  8. #[derive(Debug)]
  9. pub(crate) enum LedgerValue {
  10. Comment {
  11. value: String,
  12. },
  13. Transaction {
  14. date: String,
  15. payee: String,
  16. values: Vec<TransactionValue>,
  17. },
  18. }
  19.  
  20. #[derive(Debug)]
  21. pub(crate) enum TransactionValue {
  22. Comment {
  23. value: String,
  24. },
  25. Account {
  26. name: String,
  27. expression: String,
  28. },
  29. }
  30.  
  31. pub(crate) fn load(path: PathBuf) -> Result<Vec<LedgerValue>> {
  32. const LEDGER_COMMENTS: &'static str = r#"^; (?P<comment>[[:print:]]+)\s*$"#;
  33.  
  34. const DATE_PAYEE: &'static str = r#"(?P<date>^\d{4}/\d{2}/\d{2})(?P<payee>.*)$"#;
  35. const ACCOUNT_VALUE: &'static str = r#"^\s+(?P<account>[[:print:]]+)\s*(?P<expression>[[:print:]]*$)"#;
  36. const TRANSACTION_COMMENTS: &'static str = r#"^\s+; (?P<comment>[[:print:]]+)\s*$"#;
  37.  
  38. let ledger_comments_reg = Regex::new(LEDGER_COMMENTS).unwrap();
  39.  
  40. let date_payee_reg = Regex::new(DATE_PAYEE).unwrap();
  41. let account_value_reg = Regex::new(ACCOUNT_VALUE).unwrap();
  42. let transaction_comments_reg = Regex::new(TRANSACTION_COMMENTS).unwrap();
  43.  
  44. let input = File::open(path)?;
  45. let buffered = BufReader::new(input);
  46. let lines = buffered.lines();
  47. let mut iter = lines.into_iter();
  48.  
  49. let mut ledger = Vec::new();
  50. let mut transaction_date = String::new();
  51. let mut transaction_payee = String::new();
  52. let mut transaction_values = Vec::new();
  53. for line in &mut iter {
  54. let line = line.unwrap();
  55. if let Some(caps) = ledger_comments_reg.captures(&line) {
  56. ledger.push(LedgerValue::Comment {
  57. value: caps["comment"].to_string()
  58. });
  59. } else if let Some(caps) = date_payee_reg.captures(&line) {
  60. transaction_date = caps["date"].to_string();
  61. transaction_payee = caps["payee"].trim().to_string();
  62. break;
  63. }
  64. }
  65. for line in &mut iter {
  66. let line = line.unwrap();
  67. if let Some(caps) = date_payee_reg.captures(&line) {
  68. ledger.push(LedgerValue::Transaction {
  69. date: transaction_date,
  70. payee: transaction_payee,
  71. values: transaction_values,
  72. });
  73. transaction_date = caps["date"].to_string();
  74. transaction_payee = caps["payee"].trim().to_string();
  75. transaction_values = Vec::new();
  76. } else if let Some(caps) = transaction_comments_reg.captures(&line) {
  77. let value = TransactionValue::Comment {
  78. value: caps["comment"].to_string()
  79. };
  80. transaction_values.push(value);
  81. } else if let Some(caps) = account_value_reg.captures(&line) {
  82. let value = TransactionValue::Account {
  83. name: caps["account"].to_string(),
  84. expression: caps["expression"].to_string(),
  85. };
  86. transaction_values.push(value);
  87. }
  88. }
  89.  
  90. ledger.push(LedgerValue::Transaction {
  91. date: transaction_date,
  92. payee: transaction_payee,
  93. values: transaction_values,
  94. });
  95.  
  96. Ok(ledger)
  97. }
Add Comment
Please, Sign In to add comment