Skip to main content

nom_grapheme_clusters/
lib.rs

1//! This crate provides location for `nom` with support to grapheme clusters.
2//!
3//! # Examples
4//! ```
5//! use nom::{combinator::map, IResult};
6//! use nom_grapheme_clusters::{parse::Tag, Source, Span, SpanContent};
7//!
8//! #[derive(Debug, Clone, PartialEq, Eq)]
9//! struct ParsedAtn {
10//!     span: Span,
11//! }
12//!
13//! #[derive(Debug, Clone, PartialEq, Eq)]
14//! struct ParsedSmth {
15//!     span: Span,
16//! }
17//!
18//! fn parse_smth(input: Span) -> IResult<Span, ParsedSmth> {
19//!     map(Tag(&["s", "m", "t", "h"]), |span| ParsedSmth { span })(input)
20//! }
21//!
22//! fn parse_atn(input: Span) -> IResult<Span, ParsedAtn> {
23//!     map(Tag(&["a", "t", "n̩̊"]), |span| ParsedAtn { span })(input)
24//! }
25//!
26//! # fn main() {
27//! let source = Source::new("file.txt", "atn̩̊smtha");
28//!
29//! let span0 = source.full_span();
30//! let (span1, parsed) = parse_atn(span0).unwrap();
31//! assert_eq!(parsed.span.as_str(), "atn̩̊");
32//! assert_eq!(parsed.span.start().position(), 0);
33//! assert_eq!(parsed.span.start().line(), 0);
34//! assert_eq!(parsed.span.start().column(), 0);
35//! assert_eq!(parsed.span.len(), 3);
36//! assert_eq!(parsed.span.end().position(), 3);
37//! assert_eq!(parsed.span.end().line(), 0);
38//! assert_eq!(parsed.span.end().column(), 3);
39//!
40//! let (span2, parsed) = parse_smth(span1).unwrap();
41//! assert_eq!(parsed.span.as_str(), "smth");
42//! assert_eq!(parsed.span.start().position(), 3);
43//! assert_eq!(parsed.span.start().line(), 0);
44//! assert_eq!(parsed.span.start().column(), 3);
45//! assert_eq!(parsed.span.len(), 4);
46//! assert_eq!(parsed.span.end().position(), 7);
47//! assert_eq!(parsed.span.end().line(), 0);
48//! assert_eq!(parsed.span.end().column(), 7);
49//!
50//! let result = parse_atn(span2);
51//! assert!(result.is_err());
52//! println!("{}", result.unwrap_err());
53//! # }
54//! ```
55
56#![warn(missing_docs)]
57
58pub mod source;
59mod location;
60pub mod span;
61#[cfg(feature = "parse")]
62pub mod parse;
63
64pub use location::{LocatedSegment, Location};
65pub use source::Source;
66pub use span::{Span, SpanContent};