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// }