You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.1 KiB
120 lines
3.1 KiB
#[macro_use] extern crate log;
|
|
|
|
use log::LevelFilter;
|
|
|
|
use yopa::{model, InMemoryStorage};
|
|
use yopa::model::DataType;
|
|
use yopa::insert::{InsertObj, InsertValue, InsertRel};
|
|
use yopa::data::TypedValue;
|
|
|
|
fn main() {
|
|
simple_logging::log_to_stderr(LevelFilter::Debug);
|
|
|
|
main_test_recipes().unwrap();
|
|
}
|
|
|
|
#[allow(non_snake_case)]
|
|
fn main_test_recipes() -> anyhow::Result<()> {
|
|
simple_logging::log_to_stderr(LevelFilter::Debug);
|
|
|
|
let mut store = yopa::InMemoryStorage::new();
|
|
|
|
let Recipe = store.define_object(model::ObjectModel {
|
|
id: Default::default(),
|
|
name: "recipe".to_string(),
|
|
parent: None
|
|
})?;
|
|
|
|
let RecipeTitle = store.define_property(model::PropertyModel {
|
|
id: Default::default(),
|
|
object: Recipe,
|
|
name: "title".to_string(),
|
|
optional: false,
|
|
multiple: false,
|
|
data_type: DataType::String,
|
|
default: None
|
|
})?;
|
|
|
|
let _PrepHours = store.define_property(model::PropertyModel {
|
|
id: Default::default(),
|
|
object: Recipe,
|
|
name: "prep_hours".to_string(),
|
|
optional: true,
|
|
multiple: false,
|
|
data_type: DataType::Decimal,
|
|
default: None
|
|
})?;
|
|
|
|
let Book = store.define_object(model::ObjectModel {
|
|
id: Default::default(),
|
|
name: "book".to_string(),
|
|
parent: None
|
|
})?;
|
|
|
|
let BookName = store.define_property(model::PropertyModel {
|
|
id: Default::default(),
|
|
object: Book,
|
|
name: "name".to_string(),
|
|
optional: false,
|
|
multiple: false,
|
|
data_type: DataType::String,
|
|
default: None
|
|
})?;
|
|
|
|
let BookToRecipe = store.define_relation(model::RelationModel {
|
|
id: Default::default(),
|
|
object: Recipe,
|
|
name: "book reference".to_string(),
|
|
optional: true,
|
|
multiple: true,
|
|
related: Book
|
|
})?;
|
|
|
|
let BookToRecipePage = store.define_property(model::PropertyModel {
|
|
id: Default::default(),
|
|
object: BookToRecipe,
|
|
name: "page".to_string(),
|
|
optional: false,
|
|
multiple: false,
|
|
data_type: DataType::Integer,
|
|
default: None
|
|
})?;
|
|
|
|
debug!("{:#?}", store);
|
|
|
|
let MyBook1 = store.insert_object(InsertObj {
|
|
model_id: Book,
|
|
values: vec![
|
|
InsertValue::new(BookName, TypedValue::String("Recipe Book 1".into())),
|
|
],
|
|
relations: vec![],
|
|
})?;
|
|
|
|
store.insert_object(InsertObj {
|
|
model_id: Recipe,
|
|
values: vec![
|
|
InsertValue::new(RecipeTitle, TypedValue::String("Pancakes".into())),
|
|
],
|
|
relations: vec![
|
|
InsertRel {
|
|
model_id: BookToRecipe,
|
|
related_id: MyBook1,
|
|
values: vec![
|
|
InsertValue::new(BookToRecipePage, TypedValue::Integer(123))
|
|
]
|
|
}
|
|
],
|
|
})?;
|
|
|
|
debug!("{:#?}", store);
|
|
|
|
let as_s = serde_json::to_string_pretty(&store).unwrap();
|
|
|
|
println!("{}", as_s);
|
|
|
|
let _back : InMemoryStorage = serde_json::from_str(&as_s)?;
|
|
|
|
debug!("After unpack: {:#?}", store);
|
|
|
|
Ok(())
|
|
}
|
|
|