Implement iterators over variable and function identifiers
Relates to #37
This commit is contained in:
parent
1c68866777
commit
697fbb5d45
@ -7,6 +7,7 @@
|
||||
### Added
|
||||
|
||||
* Iterator over all identifiers within an expression, including duplicates
|
||||
* Iterators over only variable or only function identifiers within an expression, including duplicates
|
||||
* Overload the `+` operator to concatenate strings
|
||||
* Overload `<`, `<=`, `>` and `>=` for strings using lexical ordering (Note: `==` and `!=` compare strings as expected)
|
||||
* Add `len`, `str::regex_matches`, `str::regex_replace`, `str::to_lowercase`, `str::to_uppercase`, `str::trim` functions for strings
|
||||
|
@ -42,6 +42,16 @@ pub trait Operator: Debug + Display {
|
||||
fn identifier(&self) -> Option<&str> {
|
||||
None
|
||||
}
|
||||
|
||||
/// Returns a variable identifier if this operator is a variable identifier, or `None` otherwise.
|
||||
fn variable_identifier(&self) -> Option<&str> {
|
||||
None
|
||||
}
|
||||
|
||||
/// Returns a function identifier if this operator is a function identifier, or `None` otherwise.
|
||||
fn function_identifier(&self) -> Option<&str> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -719,6 +729,10 @@ impl Operator for VariableIdentifier {
|
||||
fn identifier(&self) -> Option<&str> {
|
||||
Some(&self.identifier)
|
||||
}
|
||||
|
||||
fn variable_identifier(&self) -> Option<&str> {
|
||||
Some(&self.identifier)
|
||||
}
|
||||
}
|
||||
|
||||
impl Operator for FunctionIdentifier {
|
||||
@ -757,4 +771,8 @@ impl Operator for FunctionIdentifier {
|
||||
fn identifier(&self) -> Option<&str> {
|
||||
Some(&self.identifier)
|
||||
}
|
||||
|
||||
fn function_identifier(&self) -> Option<&str> {
|
||||
Some(&self.identifier)
|
||||
}
|
||||
}
|
||||
|
@ -70,6 +70,42 @@ impl Node {
|
||||
self.iter().filter_map(|node| node.operator.identifier())
|
||||
}
|
||||
|
||||
/// Returns an iterator over all variable identifiers in this expression.
|
||||
/// Each occurrence of a variable identifier is returned separately.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
/// use evalexpr::*;
|
||||
///
|
||||
/// let tree = build_operator_tree("a + f(b + c)").unwrap(); // Do proper error handling here
|
||||
/// let mut iter = tree.iter_variable_identifiers();
|
||||
/// assert_eq!(iter.next(), Some("a"));
|
||||
/// assert_eq!(iter.next(), Some("b"));
|
||||
/// assert_eq!(iter.next(), Some("c"));
|
||||
/// assert_eq!(iter.next(), None);
|
||||
/// ```
|
||||
pub fn iter_variable_identifiers(&self) -> impl Iterator<Item = &str> {
|
||||
self.iter().filter_map(|node| node.operator.variable_identifier())
|
||||
}
|
||||
|
||||
/// Returns an iterator over all function identifiers in this expression.
|
||||
/// Each occurrence of a function identifier is returned separately.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
/// use evalexpr::*;
|
||||
///
|
||||
/// let tree = build_operator_tree("a + f(b + c)").unwrap(); // Do proper error handling here
|
||||
/// let mut iter = tree.iter_function_identifiers();
|
||||
/// assert_eq!(iter.next(), Some("f"));
|
||||
/// assert_eq!(iter.next(), None);
|
||||
/// ```
|
||||
pub fn iter_function_identifiers(&self) -> impl Iterator<Item = &str> {
|
||||
self.iter().filter_map(|node| node.operator.function_identifier())
|
||||
}
|
||||
|
||||
/// Evaluates the operator tree rooted at this node with the given context.
|
||||
///
|
||||
/// Fails, if one of the operators in the expression tree fails.
|
||||
|
Loading…
Reference in New Issue
Block a user