Skip to main content

active_dialect

Function active_dialect 

Source
pub fn active_dialect() -> Arc<dyn Dialect> 
Expand description

Construct the compiled-in dialect as a shared reference. The dialect is determined at compile time by the active feature flag.

Examples found in repository?
examples/server.rs (line 30)
17async fn main() -> Result<(), Box<dyn std::error::Error>> {
18    dotenvy::dotenv().ok();
19    let filter =
20        EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("architect_sdk=info"));
21    tracing_subscriber::fmt().with_env_filter(filter).init();
22
23    let database_url =
24        std::env::var("DATABASE_URL").unwrap_or_else(|_| "sqlite://architect.db".into());
25    ensure_database_exists(&database_url).await?;
26
27    // create_pool uses the compiled-in dialect automatically (sqlite by default).
28    let pool = create_pool(&database_url, 5).await?;
29
30    let dialect = architect_sdk::db::active_dialect();
31    ensure_sys_tables(&pool, dialect.as_ref()).await?;
32
33    let tenant_registry = load_registry_from_pool(&pool)
34        .await
35        .map_err(|e| -> Box<dyn std::error::Error> { Box::new(e) })?;
36    tracing::info!("loaded tenant registry (X-Tenant-ID required for config and entity APIs)");
37
38    let (config, package_id) = match std::env::var("PACKAGE_PATH") {
39        Ok(package_path) => {
40            tracing::info!("loading config from package path: {}", package_path);
41            let (cfg, id) = load_config_from_package_path(&package_path).await?;
42            (cfg, id)
43        }
44        Err(_) => {
45            tracing::info!("PACKAGE_PATH not set; loading config from _sys_* tables (use config APIs or POST /api/v1/config/package to insert)");
46            let cfg = load_from_pool(&pool, DEFAULT_PACKAGE_ID)
47                .await
48                .map_err(|e| -> Box<dyn std::error::Error> { Box::new(e) })?;
49            (cfg, DEFAULT_PACKAGE_ID.to_string())
50        }
51    };
52    apply_migrations(
53        &pool,
54        &config,
55        None,
56        None,
57        dialect.as_ref(),
58        &HashMap::new(),
59    )
60    .await?;
61    let model = resolve(&config)?.with_package_id(&package_id);
62    let mut package_models = HashMap::new();
63    package_models.insert(package_id.clone(), model.clone());
64    let storage = architect_sdk::init_storage_provider().await;
65    let event_client = architect_sdk::events::DecisionHubClient::from_env();
66    let authrs_client = architect_sdk::authrs::AuthrsClient::from_env();
67    let state = AppState {
68        pool: pool.clone(),
69        model: Arc::new(RwLock::new(model)),
70        package_models: Arc::new(RwLock::new(package_models)),
71        tenant_pools: Arc::new(RwLock::new(HashMap::new())),
72        tenant_registry: Arc::new(tenant_registry),
73        storage,
74        event_client,
75        authrs_client,
76        dialect,
77        extensible_cache: Default::default(),
78        cross_package_index: Arc::new(RwLock::new(None)),
79    };
80
81    let api = Router::new()
82        .merge(common_routes_with_ready(state.clone()))
83        .nest("/api/v1", config_routes(state.clone()))
84        .nest("/api/v1", report_routes(state.clone()))
85        .nest("/api/v1", entity_routes(state));
86
87    let app = Router::new().nest("/", api);
88
89    let listener = TcpListener::bind("0.0.0.0:3000").await?;
90    tracing::info!("listening on {}", listener.local_addr()?);
91    axum::serve(listener, app).await?;
92    Ok(())
93}