1use std::ops::{Range, RangeFrom, RangeTo};
2
3use nom::{
4 branch::alt,
5 bytes::complete::tag,
6 character::complete::{line_ending, multispace1, not_line_ending, space1},
7 combinator::{eof, value},
8 error::ParseError,
9 multi::many0,
10 sequence::{preceded, terminated},
11 AsChar, Compare, IResult, InputIter, InputLength, InputTake, InputTakeAtPosition, Slice,
12};
13
14use crate::KconfigInput;
15
16pub fn ws_comment<I, E: ParseError<I>>(input: I) -> IResult<I, (), E>
29where
30 I: Clone + InputLength + InputTake,
31 I: InputTakeAtPosition,
32 <I as InputTakeAtPosition>::Item: AsChar + Clone,
33 <I as InputIter>::Item: Clone,
34 I: Slice<Range<usize>> + Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
35 I: InputIter + InputLength,
36 I: Compare<&'static str>,
37 <I as InputIter>::Item: AsChar,
38 <I as InputIter>::Item: AsChar,
39{
40 value(
41 (),
42 many0(alt((
43 preceded(
45 alt((tag("#"), tag("\\#"))),
46 terminated(not_line_ending, alt((line_ending, eof))),
47 ),
48 multispace1,
49 tag(" "),
51 ))),
52 )(input)
53}
54pub fn ws<I, F, O, E: ParseError<I>>(inner: F) -> impl FnMut(I) -> IResult<I, O, E>
66where
67 I: Clone + InputLength + InputTake,
68 <I as InputIter>::Item: Clone,
69 I: InputTakeAtPosition,
70 <I as InputTakeAtPosition>::Item: AsChar + Clone,
71 I: InputTakeAtPosition,
72 <I as InputTakeAtPosition>::Item: AsChar,
73 I: Slice<Range<usize>> + Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
74 I: InputIter + InputLength,
75 I: Compare<&'static str>,
76 <I as InputIter>::Item: AsChar,
77 <I as InputIter>::Item: AsChar,
78 F: FnMut(I) -> IResult<I, O, E>,
79{
80 preceded(ws_comment, inner)
81}
82
83pub fn parse_until_eol(input: KconfigInput) -> IResult<KconfigInput, KconfigInput> {
98 terminated(not_line_ending, alt((line_ending, eof)))(input)
99}
100
101pub fn wsi<I, F, O, E: ParseError<I>>(inner: F) -> impl FnMut(I) -> IResult<I, O, E>
111where
112 I: Clone + InputLength + InputTake,
113 <I as InputIter>::Item: Clone,
114 I: InputTakeAtPosition,
115 <I as InputTakeAtPosition>::Item: AsChar + Clone,
116 I: InputTakeAtPosition,
117 <I as InputTakeAtPosition>::Item: AsChar,
118 I: Slice<Range<usize>> + Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
119 I: InputIter + InputLength,
120 I: Compare<&'static str>,
121 <I as InputIter>::Item: AsChar,
122 <I as InputIter>::Item: AsChar,
123 F: FnMut(I) -> IResult<I, O, E>,
124{
125 preceded(
126 value((), many0(alt((preceded(tag("\\"), line_ending), space1)))),
127 inner,
128 )
129}