extern crate self as icydb;
pub use icydb_core::types::{ParseU256Error, U256};
pub use icydb_model as model;
pub use icydb_model_macros::{request_execution, test};
#[doc(inline)]
pub use icydb_core::types;
pub mod value {
pub use icydb_core::value::{InputValue, OutputValue, PublicEnumValue, PublicValue, ValueTag};
}
#[doc(hidden)]
#[cfg(feature = "metrics")]
pub mod metrics {
pub use icydb_core::metrics::{
ConvergenceMetrics, EntityMetrics, InstructionMetrics, MetricsReport,
SchemaLifecycleMetrics, metrics_reset_all,
};
pub fn metrics_report() -> Result<MetricsReport, crate::Error> {
Ok(icydb_core::metrics::metrics_report()?)
}
}
#[cfg(not(target_arch = "wasm32"))]
pub mod build {
pub use crate::build_canister;
#[doc(hidden)]
pub fn __emit_canister_for_build_script(
canister_path: &str,
build_script: &str,
) -> Result<(), Box<dyn std::error::Error>> {
println!("cargo:rerun-if-changed={build_script}");
println!("cargo:rustc-check-cfg=cfg(feature, values(\"test-admin-api\"))");
let out_dir = std::env::var("OUT_DIR")?;
let actor_file = std::path::PathBuf::from(out_dir).join("actor.rs");
let actor = icydb_model::build::generate(canister_path);
std::fs::write(actor_file, actor)?;
Ok(())
}
}
pub mod db;
pub mod guards;
pub mod diagnostic {
pub use icydb_diagnostic_code::{
Diagnostic, DiagnosticAggregateKind, DiagnosticBacklogResource, DiagnosticCode,
DiagnosticComponentKind, DiagnosticConstraintContext, DiagnosticConstraintKind,
DiagnosticDecodeReason, DiagnosticDetail, DiagnosticExecutionBudgetResource,
DiagnosticExecutionBudgetScope, DiagnosticExecutionLane, DiagnosticFactSchemaMismatch,
DiagnosticFactTag, DiagnosticFunctionKind, DiagnosticMutationOperation,
DiagnosticOperatorKind, DiagnosticTypeFamily, ErrorClass, ErrorCode, ErrorOrigin,
MAX_PUBLIC_DIAGNOSTIC_FACTS, MAX_PUBLIC_QUERY_FIELD_BYTES, QueryErrorKind, QueryFieldRole,
QueryFieldSchemaMismatch, QueryProjectionCode, QueryReadAdmissionCode, RuntimeBoundaryCode,
RuntimeErrorKind, SchemaDdlAdmissionCode, SchemaMigrationCode, SqlFeatureCode,
SqlLoweringCode, SqlSurfaceMismatchCode, SqlWriteBoundaryCode, pack_u32_pair,
unpack_u32_pair, validate_known_diagnostic_fact_schema, validate_query_field_schema,
validate_raw_diagnostic_fact_schema,
};
}
mod error;
pub mod traits;
pub use error::{
ConstraintValidationFindingOutput, ConstraintValuePath, ConstraintValuePathComponent,
DiagnosticFact, Error, ErrorKind, ErrorOrigin, QueryErrorKind, QueryFieldDiagnostic,
RuntimeErrorKind,
};
pub use guards::{
ReadAuthorizationContext, ReadAuthorizationDecision, ReadAuthorizationGuard,
ReadAuthorizationSurface,
};
pub use icydb_diagnostic_code::ErrorCode;
#[doc(hidden)]
pub mod __macro {
pub use crate::db::{
TypedEntityDescriptor, TypedFieldDescriptor, TypedFieldType, ensure_default_memory_manager,
execute_generated_storage_report,
};
pub use crate::guards::{authorize_schema_read, authorize_sql_read};
#[cfg(feature = "sql")]
pub use icydb_core::db::sql_statement_dispatch;
pub use icydb_core::db::{
CompositePrimaryKeyValue, DataStore, DbSession as CoreDbSession, EntityKey, EntityKeyBytes,
EntityKeyBytesError, IndexStore, JournalTailStore, KeyValueCodec, PrimaryKeyDecode,
PrimaryKeyEncode, PrimaryKeyEncodeError, PrimaryKeyValue, SchemaStore,
StoreAllocationIdentities, StoreAllocationIdentity, StoreRegistry,
StoreRuntimeStorageCapabilities, validate_entity_key_bytes_buffer,
};
pub use icydb_core::db::{open_memory, with_selected_commit_memory};
pub use icydb_core::error::{ErrorClass, ErrorOrigin, InternalError};
pub use icydb_core::traits::{CanisterKind, Path};
pub use icydb_core::value::Value;
pub use icydb_schema::ScalarType;
}
pub mod wire;
pub mod prelude {
pub use crate::db::{
query,
query::{
CollectionOperator, CompareOperator, FieldCompareOperator, FieldRef, FilterExpr,
FilterValue, JunctionOperator, OrderExpr, OrderTerm, SetOperator, StateOperator, asc,
count, count_by, desc, exists, field, first, last, max, max_by, min, min_by, sum,
},
};
pub use crate::{
db,
traits::{EntitySource as _, Inner as _, Path as _},
types::*,
value::{InputValue, OutputValue},
};
pub use serde::{Deserialize, Serialize};
}
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
#[cfg(not(target_arch = "wasm32"))]
#[macro_export]
macro_rules! build_canister {
($canister_ty:ty) => {{
$crate::build::__emit_canister_for_build_script(
<$canister_ty as $crate::model::Path>::PATH,
file!(),
)
}};
}
#[doc(hidden)]
#[macro_export]
#[expect(
clippy::crate_in_macro_def,
reason = "generated actor bindings must live in the consuming canister crate"
)]
macro_rules! __icydb_start_actor {
() => {
#[doc(hidden)]
struct __IcydbStartRootMarker;
#[doc(hidden)]
const fn __icydb_start_root_binding(_: __IcydbStartRootMarker) {}
const _: fn(__IcydbStartRootMarker) = crate::__icydb_start_root_binding;
#[allow(
dead_code,
reason = "generated actor members are feature-dependent in downstream canisters"
)]
mod __icydb_generated {
#[doc(hidden)]
pub(crate) const __ICYDB_START_BINDING: () = ();
include!(concat!(env!("OUT_DIR"), "/actor.rs"));
}
#[allow(
unused_imports,
reason = "minimal downstream canisters may use only a subset of generated actor conveniences"
)]
use __icydb_generated::{db, db_with_request_root, startup_state};
pub use __icydb_generated::icydb_memory_requests;
};
}
#[doc(hidden)]
#[cfg(feature = "sql")]
#[macro_export]
macro_rules! __icydb_with_sql_items {
($($item:item)*) => { $($item)* };
}
#[doc(hidden)]
#[cfg(feature = "metrics")]
#[macro_export]
macro_rules! __icydb_with_metrics_items {
($($item:item)*) => { $($item)* };
}
#[doc(hidden)]
#[cfg(not(feature = "metrics"))]
#[macro_export]
macro_rules! __icydb_with_metrics_items {
($($item:item)*) => {};
}
#[doc(hidden)]
#[cfg(not(feature = "sql"))]
#[macro_export]
macro_rules! __icydb_with_sql_items {
($($item:item)*) => {};
}
#[doc(hidden)]
#[cfg(feature = "migration")]
#[macro_export]
macro_rules! __icydb_with_migration_items {
($($item:item)*) => { $($item)* };
}
#[doc(hidden)]
#[cfg(not(feature = "migration"))]
#[macro_export]
macro_rules! __icydb_with_migration_items {
($($item:item)*) => {};
}
#[doc(hidden)]
#[cfg(feature = "sql")]
#[macro_export]
macro_rules! __icydb_with_sql_endpoint {
($endpoint:literal; $($item:item)*) => { $($item)* };
}
#[doc(hidden)]
#[cfg(feature = "metrics")]
#[macro_export]
macro_rules! __icydb_with_metrics_endpoint {
($endpoint:literal; $($item:item)*) => { $($item)* };
}
#[doc(hidden)]
#[cfg(not(feature = "metrics"))]
#[macro_export]
macro_rules! __icydb_with_metrics_endpoint {
($endpoint:literal; $($item:item)*) => {
compile_error!(concat!(
"endpoint declaration `",
$endpoint,
"` requires the `icydb/metrics` Cargo feature"
));
};
}
#[doc(hidden)]
#[cfg(feature = "migration")]
#[macro_export]
macro_rules! __icydb_with_migration_endpoint {
($endpoint:literal; $($item:item)*) => { $($item)* };
}
#[doc(hidden)]
#[cfg(not(feature = "migration"))]
#[macro_export]
macro_rules! __icydb_with_migration_endpoint {
($endpoint:literal; $($item:item)*) => {
compile_error!(concat!(
"endpoint declaration `",
$endpoint,
"` requires the `icydb/migration` Cargo feature"
));
};
}
#[doc(hidden)]
#[cfg(not(feature = "sql"))]
#[macro_export]
macro_rules! __icydb_with_sql_endpoint {
($endpoint:literal; $($item:item)*) => {
compile_error!(concat!(
"endpoint declaration `",
$endpoint,
"` requires the `icydb/sql` Cargo feature"
));
};
}
#[doc(hidden)]
#[cfg(feature = "migration")]
#[macro_export]
macro_rules! __icydb_require_migration_capability {
() => {};
}
#[doc(hidden)]
#[cfg(not(feature = "migration"))]
#[macro_export]
macro_rules! __icydb_require_migration_capability {
() => {
compile_error!("source migration declarations require the `icydb/migration` Cargo feature");
};
}
#[macro_export]
#[expect(clippy::crate_in_macro_def)]
macro_rules! db {
() => {
crate::db()
};
($request_root:expr) => {
crate::db_with_request_root($request_root)
};
}
#[cfg(all(test, not(target_arch = "wasm32")))]
mod tests {
use crate::build;
struct ModelWrapper(u64);
impl icydb_model::Inner<u64> for ModelWrapper {
fn inner(&self) -> &u64 {
&self.0
}
fn into_inner(self) -> u64 {
self.0
}
}
impl icydb_model::Path for ModelWrapper {
const PATH: &'static str = "icydb::tests::ModelWrapper";
}
#[test]
fn build_facade_exports_typed_entrypoint() {
fn assert_model_inner<T: crate::traits::Inner<u64>>() {}
assert_model_inner::<ModelWrapper>();
let wrapper = ModelWrapper(7);
assert_eq!(*crate::traits::Inner::inner(&wrapper), 7);
assert_eq!(crate::traits::Inner::into_inner(wrapper), 7);
std::hint::black_box(
build_facade_macros_resolve as fn() -> Result<(), Box<dyn std::error::Error>>,
);
}
fn build_facade_macros_resolve() -> Result<(), Box<dyn std::error::Error>> {
build::build_canister!(ModelWrapper)?;
Ok(())
}
}