diff options
Diffstat (limited to 'makima/src/daemon/api/directive.rs')
| -rw-r--r-- | makima/src/daemon/api/directive.rs | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/makima/src/daemon/api/directive.rs b/makima/src/daemon/api/directive.rs index 5886766..fcc2ca5 100644 --- a/makima/src/daemon/api/directive.rs +++ b/makima/src/daemon/api/directive.rs @@ -30,6 +30,54 @@ pub struct UpdateStepDepsRequest { pub depends_on: Vec<Uuid>, } +/// Percent-encode a string for use as a URL path segment. +/// +/// Encodes all characters except unreserved characters (alphanumeric, `-`, `.`, `_`, `~`). +fn percent_encode_path(s: &str) -> String { + let mut encoded = String::with_capacity(s.len()); + for byte in s.bytes() { + match byte { + b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'.' | b'_' | b'~' => { + encoded.push(byte as char); + } + _ => { + encoded.push_str(&format!("%{:02X}", byte)); + } + } + } + encoded +} + +/// Request body for setting a single memory entry. +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SetMemoryRequest { + pub key: String, + pub value: String, +} + +/// A single entry within a batch set request. +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct BatchMemoryEntry { + pub key: String, + pub value: String, +} + +/// Request body for setting multiple memory entries at once. +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct BatchSetMemoryRequest { + pub entries: Vec<BatchMemoryEntry>, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct MemorySetRequest { + pub value: String, +} + + impl ApiClient { /// List all directives. pub async fn list_directives(&self) -> Result<JsonValue, ApiError> { @@ -145,6 +193,158 @@ impl ApiClient { let req = UpdateDirectiveMetadataRequest { pr_url, pr_branch }; self.put(&format!("/api/v1/directives/{}", directive_id), &req).await } + + // ── Directive Memory ────────────────────────────────────────────── + + /// List all memory entries for a directive. + pub async fn list_memories(&self, directive_id: Uuid) -> Result<JsonValue, ApiError> { + self.get(&format!("/api/v1/directives/{}/memory", directive_id)) + .await + } + + /// Get a single memory entry by key. + pub async fn get_memory( + &self, + directive_id: Uuid, + key: &str, + ) -> Result<JsonValue, ApiError> { + self.get(&format!( + "/api/v1/directives/{}/memory/{}", + directive_id, + percent_encode_path(key) + )) + .await + } + + /// Set (create or update) a single memory entry. + pub async fn set_memory( + &self, + directive_id: Uuid, + key: &str, + value: &str, + ) -> Result<JsonValue, ApiError> { + let req = SetMemoryRequest { + key: key.to_string(), + value: value.to_string(), + }; + self.put(&format!("/api/v1/directives/{}/memory", directive_id), &req) + .await + } + + /// Set multiple memory entries in a single request. + pub async fn batch_set_memories( + &self, + directive_id: Uuid, + entries: Vec<(String, String)>, + ) -> Result<JsonValue, ApiError> { + let req = BatchSetMemoryRequest { + entries: entries + .into_iter() + .map(|(key, value)| BatchMemoryEntry { key, value }) + .collect(), + }; + self.post( + &format!("/api/v1/directives/{}/memory/batch", directive_id), + &req, + ) + .await + } + + /// Delete a single memory entry by key. + pub async fn delete_memory( + &self, + directive_id: Uuid, + key: &str, + ) -> Result<(), ApiError> { + self.delete(&format!( + "/api/v1/directives/{}/memory/{}", + directive_id, + percent_encode_path(key) + )) + .await + } + + /// Clear all memory entries for a directive. + pub async fn clear_memories(&self, directive_id: Uuid) -> Result<(), ApiError> { + self.delete(&format!("/api/v1/directives/{}/memory", directive_id)) + .await + } + + // ── CLI-facing Directive Memory aliases ────────────────────────── + + /// Set a memory key-value pair for a directive (CLI-facing). + pub async fn directive_memory_set( + &self, + directive_id: Uuid, + key: &str, + value: &str, + ) -> Result<JsonValue, ApiError> { + let req = MemorySetRequest { + value: value.to_string(), + }; + self.put( + &format!("/api/v1/directives/{}/memory/{}", directive_id, key), + &req, + ) + .await + } + + /// Get a memory value by key for a directive (CLI-facing). + pub async fn directive_memory_get( + &self, + directive_id: Uuid, + key: &str, + ) -> Result<JsonValue, ApiError> { + self.get(&format!( + "/api/v1/directives/{}/memory/{}", + directive_id, key + )) + .await + } + + /// List all memory key-value pairs for a directive (CLI-facing). + pub async fn directive_memory_list( + &self, + directive_id: Uuid, + ) -> Result<JsonValue, ApiError> { + self.get(&format!("/api/v1/directives/{}/memory", directive_id)) + .await + } + + /// Delete a memory key for a directive (CLI-facing). + pub async fn directive_memory_delete( + &self, + directive_id: Uuid, + key: &str, + ) -> Result<(), ApiError> { + self.delete(&format!( + "/api/v1/directives/{}/memory/{}", + directive_id, key + )) + .await + } + + /// Clear all memory for a directive (CLI-facing). + pub async fn directive_memory_clear( + &self, + directive_id: Uuid, + ) -> Result<(), ApiError> { + self.delete(&format!("/api/v1/directives/{}/memory", directive_id)) + .await + } + + /// Batch set multiple memory key-value pairs for a directive (CLI-facing). + pub async fn directive_memory_batch_set( + &self, + directive_id: Uuid, + entries: serde_json::Value, + ) -> Result<JsonValue, ApiError> { + self.post( + &format!("/api/v1/directives/{}/memory/batch", directive_id), + &entries, + ) + .await + } } #[derive(Serialize)] |
