links-notation 0.13.0

Rust implementation of the Links Notation parser
Documentation
use links_notation::{parse_lino, LiNo};

#[test]
fn test_multiline_double_quoted_reference() {
    let input = r#"(
  "long
string literal representing
the reference"

  'another
long string literal
as another reference'
)"#;
    let result = parse_lino(input).unwrap();

    if let LiNo::Link {
        id: outer_id,
        values: outer_values,
    } = &result
    {
        assert!(outer_id.is_none());
        assert_eq!(outer_values.len(), 1);

        if let LiNo::Link { id, values } = &outer_values[0] {
            assert!(id.is_none());
            assert_eq!(values.len(), 2);

            if let LiNo::Ref(ref first_value) = values[0] {
                assert_eq!(
                    first_value,
                    "long\nstring literal representing\nthe reference"
                );
            } else {
                panic!("Expected first value to be a Ref");
            }

            if let LiNo::Ref(ref second_value) = values[1] {
                assert_eq!(
                    second_value,
                    "another\nlong string literal\nas another reference"
                );
            } else {
                panic!("Expected second value to be a Ref");
            }
        } else {
            panic!("Expected first outer value to be a Link");
        }
    } else {
        panic!("Expected result to be a Link");
    }
}

#[test]
fn test_simple_multiline_double_quoted() {
    let input = r#"("line1
line2")"#;
    let result = parse_lino(input).unwrap();

    if let LiNo::Link { id, values } = &result {
        assert!(id.is_none());
        assert_eq!(values.len(), 1);

        if let LiNo::Ref(ref value) = values[0] {
            assert_eq!(value, "line1\nline2");
        } else {
            panic!("Expected value to be a Ref");
        }
    } else {
        panic!("Expected result to be a Link");
    }
}

#[test]
fn test_simple_multiline_single_quoted() {
    let input = r#"('line1
line2')"#;
    let result = parse_lino(input).unwrap();

    if let LiNo::Link { id, values } = &result {
        assert!(id.is_none());
        assert_eq!(values.len(), 1);

        if let LiNo::Ref(ref value) = values[0] {
            assert_eq!(value, "line1\nline2");
        } else {
            panic!("Expected value to be a Ref");
        }
    } else {
        panic!("Expected result to be a Link");
    }
}

#[test]
fn test_multiline_quoted_as_id() {
    let input = r#"("multi
line
id": value1 value2)"#;
    let result = parse_lino(input).unwrap();

    if let LiNo::Link {
        id: outer_id,
        values: outer_values,
    } = &result
    {
        assert!(outer_id.is_none());
        assert_eq!(outer_values.len(), 1);

        if let LiNo::Link { id, values } = &outer_values[0] {
            assert_eq!(id.as_ref().unwrap(), "multi\nline\nid");
            assert_eq!(values.len(), 2);
        } else {
            panic!("Expected first value to be a Link");
        }
    } else {
        panic!("Expected result to be a Link");
    }
}