Skip to main content

seam_server/
server.rs

1/* packages/server/core/rust/src/server.rs */
2
3use crate::build_loader::RpcHashMap;
4use crate::page::{I18nConfig, PageDef};
5use crate::procedure::{ProcedureDef, SubscriptionDef};
6use crate::resolve::ResolveStrategy;
7
8/// Framework-agnostic parts extracted from `SeamServer`.
9/// Adapter crates consume this to build framework-specific routers.
10pub struct SeamParts {
11  pub procedures: Vec<ProcedureDef>,
12  pub subscriptions: Vec<SubscriptionDef>,
13  pub pages: Vec<PageDef>,
14  pub rpc_hash_map: Option<RpcHashMap>,
15  pub i18n_config: Option<I18nConfig>,
16  pub strategies: Vec<Box<dyn ResolveStrategy>>,
17}
18
19impl SeamParts {
20  pub fn has_url_prefix(&self) -> bool {
21    self.strategies.iter().any(|s| s.kind() == "url_prefix")
22  }
23}
24
25pub struct SeamServer {
26  procedures: Vec<ProcedureDef>,
27  subscriptions: Vec<SubscriptionDef>,
28  pages: Vec<PageDef>,
29  rpc_hash_map: Option<RpcHashMap>,
30  i18n_config: Option<I18nConfig>,
31  strategies: Vec<Box<dyn ResolveStrategy>>,
32}
33
34impl SeamServer {
35  pub fn new() -> Self {
36    Self {
37      procedures: Vec::new(),
38      subscriptions: Vec::new(),
39      pages: Vec::new(),
40      rpc_hash_map: None,
41      i18n_config: None,
42      strategies: Vec::new(),
43    }
44  }
45
46  pub fn procedure(mut self, proc: ProcedureDef) -> Self {
47    self.procedures.push(proc);
48    self
49  }
50
51  pub fn subscription(mut self, sub: SubscriptionDef) -> Self {
52    self.subscriptions.push(sub);
53    self
54  }
55
56  pub fn page(mut self, page: PageDef) -> Self {
57    self.pages.push(page);
58    self
59  }
60
61  pub fn rpc_hash_map(mut self, map: RpcHashMap) -> Self {
62    self.rpc_hash_map = Some(map);
63    self
64  }
65
66  pub fn i18n_config(mut self, config: I18nConfig) -> Self {
67    self.i18n_config = Some(config);
68    self
69  }
70
71  pub fn resolve_strategies(mut self, strategies: Vec<Box<dyn ResolveStrategy>>) -> Self {
72    self.strategies = strategies;
73    self
74  }
75
76  /// Consume the builder, returning framework-agnostic parts for an adapter.
77  pub fn into_parts(self) -> SeamParts {
78    SeamParts {
79      procedures: self.procedures,
80      subscriptions: self.subscriptions,
81      pages: self.pages,
82      rpc_hash_map: self.rpc_hash_map,
83      i18n_config: self.i18n_config,
84      strategies: self.strategies,
85    }
86  }
87}
88
89impl Default for SeamServer {
90  fn default() -> Self {
91    Self::new()
92  }
93}