use crate::ast::Query;
use crate::output::{QueryError, QueryReply};
use crate::parsing::text_query;
use crate::types::DateTime;
use crate::{Context, Value};
#[cfg(feature = "bundle-files")]
pub static DEFAULT_FILE: Option<&'static str> = Some(include_str!("../definitions.units"));
#[cfg(not(feature = "bundle-files"))]
pub static DEFAULT_FILE: Option<&'static str> = None;
#[cfg(feature = "bundle-files")]
pub static DATES_FILE: Option<&'static str> = Some(include_str!("../datepatterns.txt"));
#[cfg(not(feature = "bundle-files"))]
pub static DATES_FILE: Option<&'static str> = None;
#[cfg(feature = "bundle-files")]
pub static CURRENCY_FILE: Option<&'static str> = Some(include_str!("../currency.units"));
#[cfg(not(feature = "bundle-files"))]
pub static CURRENCY_FILE: Option<&'static str> = None;
pub fn eval(ctx: &mut Context, line: &str) -> Result<QueryReply, QueryError> {
ctx.set_time(DateTime::now());
let mut iter = text_query::TokenIterator::new(line.trim()).peekable();
let expr = text_query::parse_query(&mut iter);
let res = ctx.eval_query(&expr)?;
if ctx.save_previous_result {
if let QueryReply::Number(ref number_parts) = res {
if let Some(ref raw) = number_parts.raw_value {
ctx.previous_result = Some(Value::Number(raw.clone()));
}
}
}
Ok(res)
}
pub fn one_line(ctx: &mut Context, line: &str) -> Result<String, String> {
eval(ctx, line)
.as_ref()
.map(ToString::to_string)
.map_err(ToString::to_string)
}
pub fn reformat(ctx: &mut Context, line: &str) -> Query {
let mut iter = text_query::TokenIterator::new(line.trim()).peekable();
let query = text_query::parse_query(&mut iter);
let query = ctx.canonicalize_query(query);
query
}
pub fn simple_context() -> Result<Context, String> {
let message = "bundle-files feature not enabled, cannot create simple context.";
let units = DEFAULT_FILE.ok_or(message.to_owned())?;
let dates = DATES_FILE.ok_or(message.to_owned())?;
let mut ctx = Context::new();
ctx.load_definitions(units)?;
ctx.load_date_file(dates);
Ok(ctx)
}
pub fn version() -> &'static str {
env!("CARGO_PKG_VERSION")
}