fkl-parser 0.4.0

Feakin is a architecture design and visual collaboration tool. This is the parser for Feakin.
Documentation
#[cfg(test)]
mod test {
  use crate::mir;
  use crate::mir::{Aggregate, BoundedContext, ContextRelation, ContextState, Entity};
  use crate::mir::ConnectionDirection::PositiveDirected;
  use crate::mir::tactic::block::Field;
  use crate::parse;

  #[test]
  fn test() {
    let booking_ticket = r#"
ContextMap TicketBooking {
  Reservation -> Cinema;
  Reservation -> Movie;
  Reservation -> User;
}

Context Reservation {
  Aggregate Reservation;
}

Aggregate Reservation {
  Entity Ticket, Reservation;
}

Entity Reservation  {
  Struct {
    id: String;
    token: UUID;
    status: ReservationStatus = ReservationStatus.OPEN;
    expiresAt: LocalDateTime;
    createdAt: LocalDateTime;
    screeningId: String;
    screeningStartTime: LocalDateTime;
    name: String;
    surname: String;
    tickets: Set<Ticket>;
    totalPrice: BigDecimal;
  }
}

Entity Ticket  {}

Context Cinema {
  Aggregate Cinema;
}

Aggregate Cinema {
  Entity Cinema, ScreeningRoom, Seat;
}

Entity Cinema { }
Entity ScreeningRoom { }
Entity Seat { }

Context Movie {
  Aggregate Movie;
}

Aggregate Movie {
  Entity Movie, Actor, Publisher;
}

Entity Movie { }
Entity Actor { }
Entity Publisher { }

Context User {
  Aggregate User;
}

Aggregate User {
  Entity User;
}

Entity User {
  Struct {
    id: UUID;
    mobile: String;
    email: String;
    username: String;
    password: String;
    address: String;
  }
}

Entity Payment {
  Struct {
    id: UUID;
    amount: BigDecimal;
    currency: Currency;
    status: PaymentStatus;
    createdAt: LocalDateTime;
  }
}

ValueObject Price { }
ValueObject Notifications { }
"#;

    let decls = parse(booking_ticket).unwrap();
    assert_eq!(decls, mir::ContextMap {
      name: "TicketBooking".to_string(),
      state: ContextState::ToBe,
      contexts: vec![
        BoundedContext {
          name: "Cinema".to_string(),
          aggregates: vec![
            Aggregate {
              name: "Cinema".to_string(),
              description: "".to_string(),
              entities: vec![
                Entity {
                  name: "Cinema".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field { name: "".to_string(), initializer: None, type_type: "".to_string() },
                  fields: vec![],
                },
                Entity {
                  name: "ScreeningRoom".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field { name: "".to_string(), initializer: None, type_type: "".to_string() },
                  fields: vec![],
                },
                Entity {
                  name: "Seat".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field {
                    name: "".to_string(),
                    initializer: None,
                    type_type: "".to_string(),
                  },
                  fields: vec![],
                },
              ],
            }
          ],
        },
        BoundedContext {
          name: "Movie".to_string(),
          aggregates: vec![
            Aggregate {
              name: "Movie".to_string(),
              description: "".to_string(),
              entities: vec![
                Entity {
                  name: "Movie".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field {
                    name: "".to_string(),
                    initializer: None,
                    type_type: "".to_string(),
                  },
                  fields: vec![],
                },
                Entity {
                  name: "Actor".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field {
                    name: "".to_string(),
                    initializer: None,
                    type_type: "".to_string(),
                  },
                  fields: vec![],
                },
                Entity {
                  name: "Publisher".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field {
                    name: "".to_string(),
                    initializer: None,
                    type_type: "".to_string(),
                  },
                  fields: vec![],
                },
              ],
            }
          ],
        },
        BoundedContext {
          name: "Reservation".to_string(),
          aggregates: vec![
            Aggregate {
              name: "Reservation".to_string(),
              description: "".to_string(),
              entities: vec![
                Entity {
                  name: "Ticket".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field {
                    name: "".to_string(),
                    initializer: None,
                    type_type: "".to_string(),
                  },
                  fields: vec![],
                },
                Entity {
                  name: "Reservation".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field {
                    name: "".to_string(),
                    initializer: None,
                    type_type: "".to_string(),
                  },
                  fields: vec![
                    Field { name: "id".to_string(), initializer: None, type_type: "String".to_string() },
                    Field { name: "token".to_string(), initializer: None, type_type: "UUID".to_string() },
                    Field { name: "status".to_string(), initializer: Some("ReservationStatus.OPEN".to_string()), type_type: "ReservationStatus".to_string() },
                    Field { name: "expiresAt".to_string(), initializer: None, type_type: "LocalDateTime".to_string() },
                    Field { name: "createdAt".to_string(), initializer: None, type_type: "LocalDateTime".to_string() },
                    Field { name: "screeningId".to_string(), initializer: None, type_type: "String".to_string() },
                    Field { name: "screeningStartTime".to_string(), initializer: None, type_type: "LocalDateTime".to_string() },
                    Field { name: "name".to_string(), initializer: None, type_type: "String".to_string() },
                    Field { name: "surname".to_string(), initializer: None, type_type: "String".to_string() },
                    Field { name: "tickets".to_string(), initializer: None, type_type: "Set<Ticket>".to_string() },
                    Field { name: "totalPrice".to_string(), initializer: None, type_type: "BigDecimal".to_string() },
                  ],
                },
              ],
            }
          ],
        },
        BoundedContext {
          name: "User".to_string(),
          aggregates: vec![
            Aggregate {
              name: "User".to_string(),
              description: "".to_string(),
              entities: vec![
                Entity {
                  name: "User".to_string(),
                  description: "".to_string(),
                  is_aggregate_root: false,
                  identify: Field {
                    name: "".to_string(),
                    initializer: None,
                    type_type: "".to_string(),
                  },
                  fields: vec![
                    Field { name: "id".to_string(), initializer: None, type_type: "UUID".to_string() },
                    Field { name: "mobile".to_string(), initializer: None, type_type: "String".to_string() },
                    Field { name: "email".to_string(), initializer: None, type_type: "String".to_string() },
                    Field { name: "username".to_string(), initializer: None, type_type: "String".to_string() },
                    Field { name: "password".to_string(), initializer: None, type_type: "String".to_string() },
                    Field { name: "address".to_string(), initializer: None, type_type: "String".to_string() },
                  ],
                }
              ],
            }
          ],
        }],
      relations: vec![
        ContextRelation {
          source: "Reservation".to_string(),
          target: "Cinema".to_string(),
          connection_type: PositiveDirected,
          source_type: vec![],
          target_type: vec![],
        },
        ContextRelation {
          source: "Reservation".to_string(),
          target: "Movie".to_string(),
          connection_type: PositiveDirected,
          source_type: vec![],
          target_type: vec![],
        },
        ContextRelation {
          source: "Reservation".to_string(),
          target: "User".to_string(),
          connection_type: PositiveDirected,
          source_type: vec![],
          target_type: vec![],
        }],
      implementations: vec![],
      layered: None,
      source_sets: None,
      envs: vec![]
    });
  }
}