use atelier_core::model::shapes::{ AppliedTraits, Operation, Resource, Service, Simple, StructureOrUnion, }; use atelier_core::model::visitor::{walk_model, ModelVisitor}; use atelier_core::model::ShapeID; use std::cell::RefCell; use std::collections::HashSet; use atelier_test::examples::motd::make_message_of_the_day_model; struct ExampleVisitor { expected: RefCell>, } impl Default for ExampleVisitor { fn default() -> Self { Self { expected: RefCell::new( [ "service@example.motd#MessageOfTheDay", "resource@example.motd#Message", "simple@string@example.motd#Date", "operation@example.motd#GetMessage", "structure@example.motd#GetMessageInput", "structure@example.motd#GetMessageOutput", "structure@example.motd#BadDateValue", ] .iter() .map(|s| s.to_string()) .collect(), ), } } } impl ModelVisitor for ExampleVisitor { type Error = String; fn simple_shape( &self, id: &ShapeID, _: &AppliedTraits, simple: &Simple, ) -> std::result::Result<(), Self::Error> { let mut expected = self.expected.borrow_mut(); if expected.remove(&format!("simple@{}@{}", simple, id)) { Ok(()) } else { Err(id.to_string()) } } fn structure( &self, id: &ShapeID, _: &AppliedTraits, _: &StructureOrUnion, ) -> std::result::Result<(), Self::Error> { let mut expected = self.expected.borrow_mut(); if expected.remove(&format!("structure@{}", id)) { Ok(()) } else { Err(id.to_string()) } } fn service( &self, id: &ShapeID, _: &AppliedTraits, _: &Service, ) -> std::result::Result<(), Self::Error> { let mut expected = self.expected.borrow_mut(); if expected.remove(&format!("service@{}", id)) { Ok(()) } else { Err(id.to_string()) } } fn operation( &self, id: &ShapeID, _: &AppliedTraits, _: &Operation, ) -> std::result::Result<(), Self::Error> { let mut expected = self.expected.borrow_mut(); if expected.remove(&format!("operation@{}", id)) { Ok(()) } else { Err(id.to_string()) } } fn resource( &self, id: &ShapeID, _: &AppliedTraits, _: &Resource, ) -> std::result::Result<(), Self::Error> { let mut expected = self.expected.borrow_mut(); if expected.remove(&format!("resource@{}", id)) { Ok(()) } else { Err(id.to_string()) } } } #[test] fn test_model_visitor() { let model = make_message_of_the_day_model(); let visitor = ExampleVisitor::default(); let result = walk_model(&model.model, &visitor); println!("{:#?}", result); assert!(result.is_ok()); let remaining = visitor.expected.borrow(); assert!(remaining.is_empty()); }