use serde::{Deserialize, Serialize};
use serde_json::{json, Map, Value};
use crate::{CCCCClient, Result};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct VoiceDocumentFolder {
pub folder_id: String,
pub name: String,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct VoiceDocumentLibrary {
pub folders: Vec<VoiceDocumentFolder>,
pub root_order: Vec<String>,
pub documents: Vec<Map<String, Value>>,
}
#[derive(Clone, Debug, Serialize)]
#[serde(tag = "action", rename_all = "snake_case")]
pub enum VoiceDocumentLibraryAction {
CreateFolder {
name: String,
},
RenameFolder {
folder_id: String,
name: String,
},
RemoveFolder {
folder_id: String,
},
ReorderRoot {
root_order: Vec<String>,
},
Rename {
document_path: String,
name: String,
},
Move {
document_path: String,
folder_id: String,
},
Restore {
document_path: String,
},
}
impl CCCCClient {
pub fn assistant_voice_document_library(&self, group_id: &str) -> Result<VoiceDocumentLibrary> {
let result = self.call(
"assistant_voice_document_library",
Map::from_iter([("group_id".into(), json!(group_id))]),
)?;
Ok(serde_json::from_value(Value::Object(result))?)
}
pub fn assistant_voice_document_library_update(
&self,
group_id: &str,
action: &VoiceDocumentLibraryAction,
by: Option<&str>,
) -> Result<VoiceDocumentLibrary> {
let mut args: Map<String, Value> = serde_json::from_value(serde_json::to_value(action)?)?;
args.insert("group_id".into(), json!(group_id));
args.insert("by".into(), json!(by.unwrap_or("user")));
let result = self.call("assistant_voice_document_library_update", args)?;
Ok(serde_json::from_value(Value::Object(result))?)
}
pub fn assistant_voice_document_delete(
&self,
group_id: &str,
document_path: &str,
by: Option<&str>,
) -> Result<Map<String, Value>> {
self.call(
"assistant_voice_document_delete",
Map::from_iter([
("group_id".into(), json!(group_id)),
("document_path".into(), json!(document_path)),
("by".into(), json!(by.unwrap_or("user"))),
]),
)
}
}