mirror of
https://github.com/tiffany352/rink-rs
synced 2024-09-20 22:21:57 +00:00
Add units for
query
This commit is contained in:
parent
6180935d63
commit
353f82804d
3 changed files with 38 additions and 0 deletions
|
@ -62,6 +62,7 @@ pub enum Query {
|
|||
Expr(Expr),
|
||||
Convert(Expr, Conversion),
|
||||
Factorize(Expr),
|
||||
UnitsFor(Expr),
|
||||
Error(String),
|
||||
}
|
||||
|
||||
|
|
28
src/eval.rs
28
src/eval.rs
|
@ -714,6 +714,34 @@ impl Context {
|
|||
|a, x| format!("{}; {}", a, x));
|
||||
Ok(format!("Factorizations: {}{}", results, if len < 10 {""} else {"; ..."}))
|
||||
},
|
||||
Query::UnitsFor(ref expr) => {
|
||||
let val = try!(self.eval(expr));
|
||||
let val = match val {
|
||||
Value::Number(val) => val,
|
||||
_ => return Err(format!("Cannot find units for <{}>", val.show(self))),
|
||||
};
|
||||
let mut out = vec![];
|
||||
for (name, unit) in self.units.iter() {
|
||||
if let Some(&Expr::Unit(_)) = self.definitions.get(name) {
|
||||
continue
|
||||
}
|
||||
if val.1 == unit.1 {
|
||||
out.push(name);
|
||||
}
|
||||
}
|
||||
let raw = Number::unit_to_string(&val.1);
|
||||
let alias = self.aliases.get(&val.1);
|
||||
let alias = if let Some(alias) = alias {
|
||||
format!(" ({})", alias)
|
||||
} else {
|
||||
format!("")
|
||||
};
|
||||
out.sort();
|
||||
let units = out.iter().skip(1).fold(
|
||||
out.first().cloned().cloned().unwrap_or(String::new()),
|
||||
|a, x| format!("{}, {}", a, x));
|
||||
Ok(format!("Units for {}{}: {}", raw, alias, units))
|
||||
},
|
||||
Query::Expr(ref expr) => {
|
||||
let val = try!(self.eval(expr));
|
||||
Ok(val.show(self))
|
||||
|
|
|
@ -525,6 +525,15 @@ pub fn parse_query(mut iter: &mut Iter) -> Query {
|
|||
iter.next();
|
||||
return Query::Factorize(parse_eq(iter))
|
||||
},
|
||||
Some(Token::Ident(ref s)) if s == "units" => {
|
||||
iter.next();
|
||||
if let Some(Token::Ident(ref s)) = iter.peek().cloned() {
|
||||
if s == "for" || s == "of" {
|
||||
iter.next();
|
||||
}
|
||||
}
|
||||
return Query::UnitsFor(parse_eq(iter))
|
||||
},
|
||||
_ => ()
|
||||
}
|
||||
let left = parse_eq(iter);
|
||||
|
|
Loading…
Reference in a new issue