#![deny(missing_docs)]
pub use butane_codegen::{butane_type, dataresult, model, FieldType, PrimaryKeyType};
pub use butane_core::custom;
pub use butane_core::fkey::{ForeignKey, ForeignKeyOpsSync};
pub use butane_core::many::{Many, ManyOpsSync};
pub use butane_core::migrations;
pub use butane_core::query;
#[cfg(feature = "async")]
pub use butane_core::{fkey::ForeignKeyOpsAsync, many::ManyOpsAsync, DataObjectOpsAsync};
pub use butane_core::{
AsPrimaryKey, AutoPk, DataObject, DataObjectOpsSync, DataResult, Error, FieldType, FromSql,
PrimaryKeyType, Result, SqlType, SqlVal, SqlValRef, ToSql,
};
pub mod db;
#[cfg_attr(
feature = "async",
doc = r##"
# Examples
```
# use butane::query::BoolExpr;
# use butane_codegen::model;
# use butane_codegen::filter;
#[model]
struct Contestant {
#[pk]
name: String,
rank: i32,
nationality: String
}
let e: BoolExpr = filter!(Contestant, nationality == "US" && rank < 42);
let first_place = 1;
let e2 = filter!(Contestant, rank == { first_place });
let e3 = filter!(Contestant, name.like("A%"));
```
"##
)]
pub use butane_codegen::filter;
#[cfg_attr(
feature = "async",
doc = r##"
# Examples
```
# use butane::query::*;
# use butane_codegen::model;
# use butane::query;
# use butane::prelude::*;
#[model]
struct Contestant {
#[pk]
name: String,
rank: i32,
nationality: String
}
let top_tier: Query<Contestant> = query!(Contestant, rank <= 10);
```
"##
)]
#[macro_export]
macro_rules! query {
($model:ident, $filter:expr) => {
<$model as butane::DataResult>::query().filter(butane::filter!($model, $filter))
};
}
#[macro_export]
macro_rules! colname {
($model:ident, $col:ident) => {
$model::fields().$col().name()
};
}
#[cfg_attr(
feature = "async",
doc = r##"
# Examples
```no_run
# use butane::db::ConnectionSpec;
# use butane::query::BoolExpr;
# use butane_codegen::model;
# use butane::prelude::*;
# use butane::query;
# use butane::find;
# use butane::DataObject;
#[model]
struct Contestant {
#[pk]
name: String,
rank: i32,
nationality: String
}
let conn = butane::db::connect(&ConnectionSpec::new("sqlite", "foo.db")).unwrap();
let alice: Result<Contestant, butane::Error> = find!(Contestant, name == "Alice", &conn);
```
"##
)]
#[macro_export]
macro_rules! find {
($dbobj:ident, $filter:expr, $conn:expr) => {
butane::query::QueryOpsSync::load(butane::query!($dbobj, $filter).limit(1), $conn)
.and_then(|mut results| results.pop().ok_or(butane::Error::NoSuchObject))
};
}
#[macro_export]
macro_rules! find_async {
($dbobj:ident, $filter:expr, $conn:expr) => {
butane::query::QueryOpsAsync::load(butane::query!($dbobj, $filter).limit(1), $conn)
.await
.and_then(|mut results| results.pop().ok_or(butane::Error::NoSuchObject))
};
}
mod prelude_common {
#[doc(no_inline)]
pub use crate::DataObject;
#[doc(no_inline)]
pub use crate::DataResult;
}
pub mod prelude {
pub use super::prelude_common::*;
pub use butane_core::db::BackendConnection;
pub use butane_core::fkey::ForeignKeyOpsSync;
pub use butane_core::many::ManyOpsSync;
pub use butane_core::query::QueryOpsSync;
pub use butane_core::DataObjectOpsSync;
}
#[cfg(feature = "async")]
pub mod prelude_async {
pub use super::prelude_common::*;
pub use butane_core::db::BackendConnectionAsync;
pub use butane_core::fkey::ForeignKeyOpsAsync;
pub use butane_core::many::ManyOpsAsync;
pub use butane_core::query::QueryOpsAsync;
pub use butane_core::DataObjectOpsAsync;
}
pub mod internal {
pub use butane_core::internal::*;
}