1extern crate nom;
2extern crate nom_locate;
3
4use nom::bytes::complete::{tag, take_until};
5use nom::IResult;
6use nom_locate::{position, LocatedSpan};
7
8type Span<'a> = LocatedSpan<&'a str>;
9
10struct Token<'a> {
11 pub position: Span<'a>,
12 pub _foo: &'a str,
13 pub _bar: &'a str,
14}
15
16fn parse_foobar(s: Span) -> IResult<Span, Token> {
17 let (s, _) = take_until("foo")(s)?;
18 let (s, pos) = position(s)?;
19 let (s, foo) = tag("foo")(s)?;
20 let (s, bar) = tag("bar")(s)?;
21
22 Ok((
23 s,
24 Token {
25 position: pos,
26 _foo: foo.fragment(),
27 _bar: bar.fragment(),
28 },
29 ))
30}
31
32fn main() {
33 let input = Span::new("Lorem ipsum \n foobar");
34 let output = parse_foobar(input);
35 let position = output.unwrap().1.position;
36 assert_eq!(position, unsafe {
37 Span::new_from_raw_offset(
38 14, 2, "", (), )
43 });
44 assert_eq!(position.get_column(), 2);
45}