Julio Biason
2 years ago
4 changed files with 119 additions and 0 deletions
@ -0,0 +1,32 @@ |
|||||||
|
# This file is automatically @generated by Cargo. |
||||||
|
# It is not intended for manual editing. |
||||||
|
version = 3 |
||||||
|
|
||||||
|
[[package]] |
||||||
|
name = "memchr" |
||||||
|
version = "2.5.0" |
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||||
|
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" |
||||||
|
|
||||||
|
[[package]] |
||||||
|
name = "minimal-lexical" |
||||||
|
version = "0.2.1" |
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||||
|
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" |
||||||
|
|
||||||
|
[[package]] |
||||||
|
name = "nom" |
||||||
|
version = "7.1.3" |
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index" |
||||||
|
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" |
||||||
|
dependencies = [ |
||||||
|
"memchr", |
||||||
|
"minimal-lexical", |
||||||
|
] |
||||||
|
|
||||||
|
[[package]] |
||||||
|
name = "nomfoamtest" |
||||||
|
version = "0.1.0" |
||||||
|
dependencies = [ |
||||||
|
"nom", |
||||||
|
] |
@ -0,0 +1,9 @@ |
|||||||
|
[package] |
||||||
|
name = "nomfoamtest" |
||||||
|
version = "0.1.0" |
||||||
|
edition = "2021" |
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
||||||
|
|
||||||
|
[dependencies] |
||||||
|
nom = "7.1.3" |
@ -0,0 +1,73 @@ |
|||||||
|
//! Foam format parser.
|
||||||
|
|
||||||
|
use std::str::FromStr; |
||||||
|
|
||||||
|
use nom::bytes::complete::is_not; |
||||||
|
use nom::bytes::complete::tag; |
||||||
|
use nom::bytes::complete::take_until; |
||||||
|
use nom::IResult; |
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq)] |
||||||
|
struct Comment { |
||||||
|
comment: String, |
||||||
|
} |
||||||
|
|
||||||
|
impl FromStr for Comment { |
||||||
|
type Err = (); |
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> { |
||||||
|
Ok(Self { |
||||||
|
comment: s.trim().to_string(), |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn multiline_comment(input: &str) -> IResult<&str, Comment> { |
||||||
|
let (input, _) = tag("/*")(input)?; |
||||||
|
let (input, content) = take_until("*/")(input)?; |
||||||
|
let (input, _) = tag("*/")(input)?; |
||||||
|
|
||||||
|
Ok((input, Comment::from_str(content).unwrap())) |
||||||
|
} |
||||||
|
|
||||||
|
fn singleline_comment(input: &str) -> IResult<&str, Comment> { |
||||||
|
let (input, _) = tag("//")(input)?; |
||||||
|
let (input, content) = is_not("\n\r")(input)?; |
||||||
|
|
||||||
|
Ok((input, Comment::from_str(content).unwrap())) |
||||||
|
} |
||||||
|
|
||||||
|
#[cfg(test)] |
||||||
|
mod tests { |
||||||
|
use super::*; |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn test_multiline_comment() { |
||||||
|
let text = "/* this is comment */"; |
||||||
|
let result = multiline_comment(text); |
||||||
|
assert_eq!( |
||||||
|
result, |
||||||
|
Ok(( |
||||||
|
"", |
||||||
|
Comment { |
||||||
|
comment: "this is comment".to_string() |
||||||
|
} |
||||||
|
)) |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn test_singleline_comment() { |
||||||
|
let text = "// this is comment"; |
||||||
|
let result = singleline_comment(text); |
||||||
|
assert_eq!( |
||||||
|
result, |
||||||
|
Ok(( |
||||||
|
"", |
||||||
|
Comment { |
||||||
|
comment: "this is comment".to_string() |
||||||
|
} |
||||||
|
)) |
||||||
|
) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue