1pub use crate::parser::pricedb_parser::{pricedb_from_file, pricedb_from_str};
6pub use crate::parser::tackler_txns::git_to_txns;
7pub use crate::parser::tackler_txns::paths_to_txns;
8pub use crate::parser::tackler_txns::string_to_txns;
9use std::fmt::Write;
10use winnow::error::{ErrMode, FromExternalError};
11
12mod error;
13mod pricedb_parser;
14mod tackler_parser;
15mod tackler_txns;
16
17use crate::kernel::settings::Settings;
18use crate::parser::error::TacklerTxnError;
19use crate::parser::parts::identifier::{parse_identifier, parse_multi_part_id};
20use crate::tackler;
21use winnow::Stateful;
22
23pub(crate) mod parts;
24
25pub(crate) type Stream<'is> = Stateful<&'is str, &'is mut Settings>;
26
27pub(crate) fn make_semantic_error<
28 'is,
29 E: winnow::error::FromExternalError<Stream<'is>, TacklerTxnError>,
30>(
31 is: &mut Stream<'is>,
32 msg: &str,
33) -> ErrMode<E> {
34 ErrMode::from_external_error(is, TacklerTxnError::semantic_error(msg)).cut()
35}
36
37pub(crate) fn from_error<
38 'is,
39 E: winnow::error::FromExternalError<Stream<'is>, TacklerTxnError>,
40 SE: std::error::Error + ?Sized,
41>(
42 is: &mut Stream<'is>,
43 err: &SE,
44) -> ErrMode<E> {
45 ErrMode::from_external_error(
46 is,
47 TacklerTxnError::semantic_error(err.to_string().as_str()),
48 )
49 .cut()
50}
51
52pub fn is_valid_identifier(id: &str) -> Result<bool, tackler::Error> {
57 let mut ptr = id;
58 let res = parse_identifier(&mut ptr);
59
60 if res.is_err() || !ptr.is_empty() {
61 let mut msg = format!("Invalid identifier '{id}'. ");
62 match res {
63 Err(e) => {
64 let _ = write!(msg, "Error was {e}");
65 }
66 Ok(_) => {
67 let _ = write!(msg, "Extra characters: '{ptr}')");
68 }
69 }
70 return Err(msg.into());
71 }
72 Ok(true)
73}
74
75pub fn is_valid_name(name: &str) -> Result<bool, tackler::Error> {
80 let mut ptr = name;
81 let res = parse_multi_part_id(&mut ptr);
82
83 if res.is_err() || !ptr.is_empty() {
84 let mut msg = format!("Invalid name '{name}'. ");
85 match res {
86 Err(e) => {
87 let _ = write!(msg, "Error was {e}");
88 }
89 Ok(_) => {
90 let _ = write!(msg, "Extra characters: '{ptr}')");
91 }
92 }
93 return Err(msg.into());
94 }
95 Ok(true)
96}
97
98#[cfg(test)]
99mod tests;