use crate::{client::WitClient, errors::Error, IntentBasic};
use reqwest::Method;
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
#[derive(Debug)]
pub struct GetUtterancesRequest {
url_params: Vec<(String, String)>,
}
#[derive(Debug)]
pub struct GetUtterancesRequestBuilder {
limit: u32,
offset: Option<u32>,
intents: Option<Vec<String>>,
}
impl GetUtterancesRequestBuilder {
pub fn new(limit: u32) -> Result<Self, Error> {
if !(1..=10000).contains(&limit) {
return Err(Error::InvalidArgument(format!(
"limit for getting utterances must be between 1 and 10000 inclusive, got {}",
limit
)));
}
Ok(Self {
limit,
offset: None,
intents: None,
})
}
pub fn offset(mut self, offset: u32) -> Self {
self.offset = Some(offset);
self
}
pub fn intents(mut self, intents: Vec<String>) -> Self {
self.intents = Some(intents);
self
}
pub fn build(self) -> GetUtterancesRequest {
let mut url_params = Vec::new();
url_params.push((String::from("limit"), self.limit.to_string()));
if let Some(offset) = self.offset {
url_params.push((String::from("offset"), offset.to_string()));
}
if let Some(intents) = self.intents {
url_params.push((String::from("intents"), intents.join(",")))
}
GetUtterancesRequest { url_params }
}
}
#[derive(Debug, Serialize)]
pub struct NewUtteranceEntity {
entity: String,
start: u32,
end: u32,
body: String,
entities: Vec<NewUtteranceEntity>,
}
impl NewUtteranceEntity {
pub fn new(
entity: String,
start: u32,
end: u32,
body: String,
entities: Vec<NewUtteranceEntity>,
) -> Self {
Self {
entity,
start,
end,
body,
entities,
}
}
}
#[derive(Debug, Serialize)]
pub struct NewUtteranceTrait {
#[serde(rename = "trait")]
trait_: String,
value: String,
}
impl NewUtteranceTrait {
pub fn new(trait_name: String, value: String) -> Self {
Self {
trait_: trait_name,
value,
}
}
}
#[derive(Debug, Serialize)]
pub struct NewUtterance {
text: String,
entities: Vec<NewUtteranceEntity>,
traits: Vec<NewUtteranceTrait>,
intent: Option<String>,
}
impl NewUtterance {
pub fn new(
text: String,
entities: Vec<NewUtteranceEntity>,
traits: Vec<NewUtteranceTrait>,
intent: Option<String>,
) -> Self {
Self {
text,
entities,
traits,
intent,
}
}
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct CreateUtteranceResponse {
pub sent: bool,
pub n: u32,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct DeleteUtteranceResponse {
pub sent: bool,
pub n: u32,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct UtteranceResponse {
pub text: String,
pub intent: IntentBasic,
pub entities: Vec<UtteranceResponseEntity>,
pub traits: Vec<UtteranceResponseTrait>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct UtteranceResponseEntity {
pub id: String,
pub name: String,
pub role: String,
pub start: u32,
pub end: u32,
pub body: String,
pub entities: Vec<UtteranceResponseEntity>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct UtteranceResponseTrait {
pub id: String,
pub name: String,
pub value: String,
}
impl WitClient {
pub async fn get_utterances(
&self,
utterances_request: GetUtterancesRequest,
) -> Result<Vec<UtteranceResponse>, Error> {
let data = self
.make_request(
Method::GET,
"/utterances",
utterances_request.url_params,
Option::<Value>::None,
)
.await?;
Ok(data)
}
pub async fn create_utterances(
&self,
utterances: Vec<NewUtterance>,
) -> Result<CreateUtteranceResponse, Error> {
let data = self
.make_request(Method::POST, "/utterances", vec![], Some(utterances))
.await?;
Ok(data)
}
pub async fn delete_utterances(
&self,
utterance_texts: Vec<String>,
) -> Result<DeleteUtteranceResponse, Error> {
let utterances: Vec<Value> = utterance_texts
.into_iter()
.map(|text| json!({"text": text}))
.collect();
let data = self
.make_request(Method::DELETE, "/utterances", vec![], Some(utterances))
.await?;
Ok(data)
}
}