Skip to main content

state_engine/ports/
required.rs

1// Required Ports - アプリケーションが実装すべきインターフェース
2use serde_json::Value;
3use std::collections::HashMap;
4
5/// プロセスメモリクライアント
6/// 論理キー→物理キーの変換。request/config/headerに分散したデータアクセス
7pub trait InMemoryClient: Send + Sync {
8    /// プロセスメモリから値を取得
9    fn get(&self, key: &str) -> Option<Value>;
10
11    /// プロセスメモリに値を設定
12    fn set(&mut self, key: &str, value: Value);
13
14    /// プロセスメモリから値を削除
15    fn delete(&mut self, key: &str) -> bool;
16}
17
18/// DBクライアント
19/// DB接続・クエリ実行(PDO相当)
20///
21/// # connection 引数について
22/// - Value::Object: 接続情報が含まれる Object (例: {host: "...", port: 3306, ...})
23/// - Value::String: 接続識別子 (例: "common", "tenant")
24///
25/// **重要:** DBClient 実装内で State を呼び出してはいけません。
26/// String 形式の connection を受け取った場合は、実装側で事前に用意した
27/// 接続マップから取得するか、エラーを返してください。
28pub trait DBClient: Send + Sync {
29    /// レコード取得(単数でも複数でも対応)
30    ///
31    /// # Arguments
32    /// * `connection` - 接続情報 (Object or String)
33    /// * `table` - テーブル名
34    /// * `columns` - SELECT するカラム名の配列(map から自動抽出)
35    /// * `where_clause` - WHERE 条件(省略可)
36    ///
37    /// # Returns
38    /// * `Some(Vec<HashMap>)` - 取得成功(0件以上)
39    /// * `None` - エラー
40    ///
41    /// # SQL 生成例
42    /// ```sql
43    /// SELECT db_host, db_port, db_database FROM tenants WHERE id=1
44    /// ```
45    fn fetch(
46        &self,
47        connection: &Value,
48        table: &str,
49        columns: &[&str],
50        where_clause: Option<&str>,
51    ) -> Option<Vec<HashMap<String, Value>>>;
52}
53
54/// KVSクライアント
55/// Redis等のKVS操作
56///
57/// KVSは文字列のみを扱う(primitive型)。
58/// serialize/deserializeはState層で行う。
59pub trait KVSClient: Send + Sync {
60    /// キーから値を取得
61    ///
62    /// # Returns
63    /// * `Some(String)` - 取得成功
64    /// * `None` - キーが存在しない
65    fn get(&self, key: &str) -> Option<String>;
66
67    /// キーに値を設定
68    ///
69    /// # Arguments
70    /// * `key` - キー
71    /// * `value` - 値(文字列)
72    /// * `ttl` - TTL(秒)
73    fn set(&mut self, key: &str, value: String, ttl: Option<u64>) -> bool;
74
75    /// キーを削除
76    fn delete(&mut self, key: &str) -> bool;
77}
78
79/// ENVクライアント
80/// 環境変数取得
81pub trait ENVClient: Send + Sync {
82    /// 環境変数を取得
83    fn get(&self, key: &str) -> Option<String>;
84}
85
86// future function: API Client
87// /// 外部API呼び出し
88// pub trait APIClient: Send + Sync {
89//     /// GETリクエスト
90//     fn get(&self, url: &str, headers: Option<&HashMap<String, String>>) -> Result<Value, String>;
91
92//     /// POSTリクエスト
93//     fn post(
94//         &self,
95//         url: &str,
96//         body: &Value,
97//         headers: Option<&HashMap<String, String>>,
98//     ) -> Result<Value, String>;
99// }