finitio 0.1.0

Finitio data language
Documentation

use super::heading::{parse_heading, Heading};
use crate::common::FilePosition;
use crate::fio::common::Span;
use nom::{combinator::map, IResult};
use serde::{Serialize, Deserialize};

#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
pub struct TupleType {
    pub heading: Heading,
    pub position: FilePosition,
}

pub fn parse_tuple(input: Span) -> IResult<Span, TupleType> {
    map(parse_heading, |heading| TupleType {
        heading,
        position: input.into(),
    })(input)
}

#[cfg(test)]
use super::{RefType, Type, heading::{Attribute}};
#[cfg(test)]
use crate::fio::common::assert_parse;

#[test]
fn test_parse_tuple_simple() {
    assert_parse(
        parse_tuple(Span::new("{ name: String, age:? Number}")),
        TupleType {
            heading: Heading {
                attributes: vec![
                    Attribute {
                        name: "name".to_string(),
                        att_type: Type::RefType(RefType {
                            name: "String".to_string(),
                            position: FilePosition { line: 1, column: 9 },
                        }),
                        optional: false,
                        position: FilePosition { line: 1, column: 3 },
                    },
                    Attribute {
                        name: "age".to_string(),
                        att_type: Type::RefType(RefType {
                            name: "Number".to_string(),
                            position: FilePosition {
                                line: 1,
                                column: 23,
                            },
                        }),
                        optional: true,
                        position: FilePosition {
                            line: 1,
                            column: 17,
                        },
                    },
                ],
                position: FilePosition { line: 1, column: 1 },
            },
            position: FilePosition { line: 1, column: 1 },
        },
    );
}