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}