Skip to main content

valence_core/
lib.rs

1//! Valence core ports: storage routing, host-injectable traits, and runtime builder.
2//!
3//! ## Stack position
4//!
5//! ```text
6//! valence public crate → valence-core (this crate) → valence-telemetry
7//! backends (mem, surreal, third-party) implement [`DatabaseBackend`]
8//! ```
9//!
10//! ## Entry points
11//!
12//! - [`Valence`] / [`ValenceBuilder`] — boot and wire backends
13//! - [`DatabaseBackend`] — storage adapter trait (open `engine_id`)
14//! - [`DatabaseRouter`] — heterogeneous engine registry
15//! - [`ports`] — secrets, actor, endpoints (host-injectable)
16//! - [`Model`] — generated CRUD surface
17//! - [`ttl`] — schema TTL policy, [`prepare_create_content`], ensure via
18//!   [`Valence::ensure_ttl_for_all`] / [`Valence::ensure_ttl_for_table`]
19//! - [`storage_layout`] — schema → physical fields; DDL export; ensure/sync typed tables via
20//!   [`Valence::ensure_typed_tables_from_registry`] / [`Valence::sync_typed_tables_from_registry`]
21//!
22//! ## Examples
23//!
24//! ```
25//! use std::sync::Arc;
26//! use valence_backend_mem::InMemoryBackend;
27//! use valence_core::Valence;
28//!
29//! let valence = Valence::builder()
30//!     .add_backend("default", Arc::new(InMemoryBackend::new()))
31//!     .build()
32//!     .expect("build");
33//! assert!(valence.active_backend().is_ok());
34//! ```
35//!
36//! ## Gotchas
37//!
38//! - Engine SDKs and product host crates must never appear in this crate
39//!   (use `valence-backend-*` and separate host adapters)
40//! - Host-owned codegen lives in `valence-codegen`, not here
41//! - Table TTL is create-only; Deferred backends need the platform sweeper (Future)
42
43#![cfg_attr(test, allow(clippy::expect_used, clippy::unwrap_used))]
44
45extern crate self as valence_core;
46
47pub mod actor;
48pub mod actor_policy;
49pub mod admin_entity_delete;
50pub mod backend;
51pub mod batch;
52pub mod compiled_query;
53pub mod compiled_query_factory;
54pub mod connection;
55pub mod currency;
56pub mod database_retry;
57pub mod datetime_unix;
58pub mod deletion;
59pub mod entity;
60pub mod error;
61pub mod evaluator;
62pub mod iter;
63pub mod json_as;
64pub mod known_engines;
65pub mod model;
66pub mod owner_ref;
67pub mod ownership;
68pub mod ports;
69pub mod privacy;
70pub mod privacy_policies;
71pub mod query;
72pub mod query_compiler;
73pub mod query_compiler_registry;
74pub mod read_cache;
75pub mod record_id;
76pub mod redact;
77pub mod reference;
78pub mod register_logical;
79pub mod registry;
80pub mod request_cache;
81pub mod router;
82pub mod router_key;
83pub mod row_json;
84pub mod runtime;
85pub mod safe_ident;
86pub mod schema;
87pub mod schema_api;
88pub mod schema_types;
89pub mod side_effect;
90pub mod storage_layout;
91pub mod trait_registry;
92pub mod trait_schema;
93pub mod ttl;
94pub mod validation;
95
96#[cfg(feature = "instrumentation")]
97pub mod instrumentation;
98
99/// Hidden re-exports for generated model code and platform migrations.
100#[doc(hidden)]
101pub mod __internal {
102    pub use crate::compiled_query::CompiledQuery;
103    pub use crate::query_compiler::QueryCompiler;
104}
105
106pub use actor::Actor;
107pub use actor_policy::{
108    is_system_shaped_actor, ActorJsonPolicy, ActorTrust, RejectExternalSystemActor,
109};
110pub use admin_entity_delete::{queue_delete_entity, queue_delete_entity_returning_run_id};
111#[cfg(feature = "compiler-indradb")]
112pub use backend::IndraQueryCompiler;
113#[cfg(feature = "compiler-mongodb")]
114pub use backend::MongoQueryCompiler;
115#[cfg(feature = "compiler-redis")]
116pub use backend::RedisQueryCompiler;
117#[cfg(feature = "compiler-sql")]
118pub use backend::SqlQueryCompiler;
119#[cfg(feature = "compiler-surreal")]
120pub use backend::SurrealQueryCompiler;
121pub use backend::{BackendCapabilities, DatabaseBackend};
122pub use batch::BatchCreatable;
123pub use compiled_query::CompiledQuery;
124pub use connection::{
125    extract_id_from_record, extract_id_from_record_display, extract_id_from_select_value,
126    id_from_model, Cardinality, IdHolder, OnDelete,
127};
128pub use currency::{Currency, CurrencyCode, CurrencyError, ParseCurrencyCodeError};
129pub use database_retry::retry_on_database_tx_conflict;
130pub use deletion::{
131    apply_deletion_node, check_dag_delete_privacy, check_dag_delete_privacy_with_registry,
132    dispatch, is_deletion_dispatcher_registered, register_deletion_dispatcher,
133    register_noop_deletion_dispatcher_for_tests, DeletionRequest, DeletionService,
134};
135#[doc(hidden)]
136pub use deletion::{
137    dispatch_queued_delete_side_effects, DeleteSideEffectDescriptor, DeleteSideEffectDispatchFn,
138};
139pub use entity::ValenceEntity;
140pub use error::{Error, Result};
141pub use evaluator::{
142    Database, DatabaseEvaluator, DatabaseFromEngine, ResolverContext, DEFAULT_IN_MEMORY,
143    DEFAULT_IN_MEMORY_ROUTER_KEY,
144};
145pub use iter::{
146    find_iter_descriptor, iter_descriptors_for_table, IterDescriptor, IterEvaluation,
147    IterExecuteFn, IterShouldRunFn,
148};
149pub use known_engines::KnownEngines;
150pub use model::{FieldOperation, Model, PrivacyError, SchemaMetadata};
151pub use owner_ref::{OwnerKind, OwnerRef, OwnershipConfig};
152pub use ownership::OwnershipService;
153pub use ports::actor::{ActorContext, ActorFactory, JsonActorContext, JsonActorFactory};
154pub use ports::endpoints::{
155    DatabaseEndpointResolver, EnvEndpointResolver, NoopEndpointResolver, StaticEndpointResolver,
156};
157pub use ports::secrets::{EnvSecretProvider, NoOpSecretProvider, SecretProvider};
158pub use privacy::{
159    privacy_bypass_active, PolicyEvaluator, PrivacyEvaluator, PrivacyOperation, PrivacyRule,
160    PRIVACY_BYPASS_ENV, PRIVACY_BYPASS_FORCE_ON_ENV,
161};
162pub use query::{
163    DateTimePredicate, HopSource, HopType, IdOnlyRecord, IntPredicate, NullPredicate, QueryCore,
164    RecordPredicate, SortDirection, StringPredicate, MAX_QUERY_LIMIT, MAX_QUERY_OFFSET,
165};
166pub use query_compiler::QueryCompiler;
167pub use query_compiler_registry::{
168    compile_for_engine, global_compiler_registry, QueryCompilerRegistry,
169};
170pub use read_cache::{
171    clear_for_test, get_record_via_cache, get_record_with_ownership_bundle_via_cache, invalidate,
172    invalidate_for_backend, read_cache_enabled,
173};
174pub use record_id::RecordId;
175pub use redact::{redact_credentials_in_text, redact_endpoint};
176pub use reference::{Reference, ReferencedEntity, WithReference};
177pub use register_logical::{
178    register_backend_logical_names, register_backend_logical_names_slices,
179    RegisterBackendLogicalNamesOptions,
180};
181pub use request_cache::RequestPermissionCache;
182pub use router::DatabaseRouter;
183pub use router_key::router_key;
184pub use runtime::{
185    RouterValenceFactory, RouterValenceFactoryConfig, Valence, ValenceBuilder, ValenceFactory,
186};
187pub use schema::{
188    schema_connections_for_table, SchemaConnectionsOverlayInit, SchemaMetadataInit,
189    SchemaMetadataStruct, SchemaRegistry,
190};
191pub use schema_api::{
192    ForeignKeyRef, Schema, SchemaConnection, SchemaEdge, SchemaField, SchemaMeta, SchemaPolicies,
193    SchemaPolicyRule, SchemaPolicyRules, SchemaPrivacy,
194};
195pub use schema_types::{FieldType, JsonAsSerdeError, Role, Validator};
196pub use side_effect::{FieldChange, Mutation, MutationKind, SideEffect};
197pub use storage_layout::{
198    AdditiveOp, FieldStorage, LayoutDiff, LayoutField, SqlColumnType, StorageLayout,
199    SurrealFieldType,
200};
201pub use trait_registry::TraitRegistry;
202pub use trait_schema::{
203    TraitDefinition, TraitDefinitionInit, TraitFieldDef, TraitImplementor, TraitPolicies,
204    TraitPolicyRules,
205};
206pub use ttl::{
207    list_ttl_table_names, prepare_create_content, reset_ttl_warn_state_for_tests,
208    ttl_warn_emit_count_for_tests, BackendTtlCapability, SchemaTtlPolicy, EXPIRE_AT_FIELD,
209};
210pub use valence_telemetry::{ConsoleSink, NoOpSink, TelemetrySink};
211
212#[cfg(feature = "instrumentation")]
213pub use instrumentation::{wrap_backend, InstrumentedBackend, MutationTimer};
214
215pub use inventory;