a small relational database with user-editable schema for manual data entry
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.
 
 
 
 
 
 
yopa/yopa-test/src/main.rs

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(())
}