mod entity;
fn main() -> elephantry::Result {
let database_url = std::env::var("DATABASE_URL")
.unwrap_or_else(|_| "postgres://localhost/elephantry".to_string());
let elephantry = elephantry::Pool::default().add_default("elephantry", &database_url)?;
let count = elephantry.count_where::<entity::EventModel>("name = $1", &[&"pageview"])?;
println!("Count events: {count}");
assert_eq!(count, 7);
println!();
println!("Find one event:\n");
find_by_pk::<entity::EventModel>(&elephantry, "f186b680-237d-449d-ad66-ad91c4e53d3d")?;
println!();
println!("Find all events:\n");
find_all::<entity::EventModel>(&elephantry)?;
println!();
println!("Find all extra events:\n");
find_all::<entity::EventExtraModel>(&elephantry)?;
println!();
println!("Insert one row:\n");
let new_event = entity::Event::<String> {
uuid: None,
name: "purchase".to_string(),
visitor_id: Some(15),
#[cfg(feature = "json")]
properties: serde_json::json!({ "amount": 200 }),
#[cfg(not(feature = "json"))]
properties: "{\"amount\": 200}".to_string(),
#[cfg(feature = "json")]
browser: serde_json::json!({ "name": "Firefox", "resolution": { "x": 1280, "y": 800 } }),
#[cfg(not(feature = "json"))]
browser: "{ \"name\": \"Firefox\", \"resolution\": { \"x\": 1280, \"y\": 800 } }"
.to_string(),
generic: None,
};
let mut entity = insert_one::<entity::EventModel>(&elephantry, &new_event)?;
println!();
println!("Update one row:\n");
entity.name = "pageview".to_string();
let entity = update_one::<entity::EventModel>(
&elephantry,
&elephantry::pk!(uuid => entity.uuid),
&entity,
)?;
assert_eq!(&entity.name, "pageview");
println!();
println!("Delete one row\n");
elephantry.delete_one::<entity::EventModel>(&entity)?;
let uuid = entity.uuid.unwrap();
assert!(
elephantry
.find_by_pk::<entity::EventModel>(&elephantry::pk! {uuid => uuid})?
.is_none()
);
assert!(!elephantry.exist_where::<entity::EventModel>("uuid = $1", &[&uuid])?);
let count = elephantry
.model::<entity::EventModel>()
.count_uniq_visitor()?;
assert_eq!(count, 4);
println!("Count uniq visitor: {count}");
Ok(())
}
fn find_by_pk<M>(connection: &elephantry::Connection, uuid: &str) -> elephantry::Result
where
M: elephantry::Model,
M::Entity: std::fmt::Debug,
{
#[cfg(feature = "uuid")]
let uuid = uuid::Uuid::parse_str(uuid).unwrap();
let event = connection.find_by_pk::<M>(&elephantry::pk!(uuid))?;
match event {
Some(event) => println!("{event:?}"),
None => println!("Event '{uuid}' not found"),
};
Ok(())
}
fn find_all<M>(connection: &elephantry::Connection) -> elephantry::Result
where
M: elephantry::Model,
M::Entity: std::fmt::Debug,
{
let events = connection.find_all::<M>(None)?;
if events.is_empty() {
println!("No events in database.");
} else {
for event in events {
println!("{event:?}");
}
}
Ok(())
}
fn insert_one<M>(
connection: &elephantry::Connection,
entity: &M::Entity,
) -> elephantry::Result<M::Entity>
where
M: elephantry::Model,
M::Entity: std::fmt::Debug,
{
let new_entity = connection.insert_one::<M>(entity)?;
println!("{new_entity:?}");
Ok(new_entity)
}
fn update_one<M>(
connection: &elephantry::Connection,
pk: &std::collections::HashMap<&str, &dyn elephantry::ToSql>,
entity: &M::Entity,
) -> elephantry::Result<M::Entity>
where
M: elephantry::Model,
M::Entity: std::fmt::Debug,
{
let new_entity = connection.update_one::<M>(pk, entity)?;
println!("{new_entity:?}");
Ok(new_entity.unwrap())
}