-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathset_clause.rs
56 lines (50 loc) · 1.68 KB
/
set_clause.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use crate::where_clause::value_path;
use nom::{
bytes::complete::{tag_no_case, take_till},
character::complete::{char, multispace0, multispace1},
combinator::opt,
multi::separated_list1,
sequence::delimited,
IResult, Parser,
};
use xml_mut_data::{SetClause, ValueAssignment, ValueVariant};
pub fn literal_quoted_string(s: &str) -> IResult<&str, &str> {
let (s, res) = delimited(char('\"'), take_till(|c| c == '\"'), char('\"')).parse(s)?;
Ok((s, res))
}
pub fn value_variant(s: &str) -> IResult<&str, ValueVariant> {
let (s, maybe_p_node_exists) = opt(value_path).parse(s)?;
Ok(if let Some(p_node_exists) = maybe_p_node_exists {
(s, ValueVariant::Selector(p_node_exists))
} else {
let (s, p_equals) = literal_quoted_string(s)?;
(s, ValueVariant::LiteralString(p_equals))
})
}
pub fn value_assignment(s: &str) -> IResult<&str, ValueAssignment> {
let (s, target) = value_path(s)?;
let (s, _) = multispace1(s)?;
let (s, _) = tag_no_case("=")(s)?;
let (s, _) = multispace1(s)?;
let (s, source) = value_variant(s)?;
Ok((s, ValueAssignment { target, source }))
}
pub fn comma_surounded_mulispace01(s: &str) -> IResult<&str, &str> {
let (s, _) = multispace0(s)?;
let (s, and_word) = tag_no_case(",")(s)?;
let (s, _) = multispace1(s)?;
Ok((s, and_word))
}
pub fn set_clause(s: &str) -> IResult<&str, SetClause> {
let (s, set_word) = tag_no_case("set")(s)?;
let (s, _) = multispace1(s)?;
let (s, assignments) =
separated_list1(comma_surounded_mulispace01, value_assignment).parse(s)?;
Ok((
s,
SetClause {
set_word,
assignments,
},
))
}