use crate::{client::WitClient, errors::Error, DeleteResponse, EntityBasic};
use reqwest::Method;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct Keyword {
pub keyword: String,
pub synonyms: Vec<String>,
}
impl Keyword {
pub fn new(keyword: String, synonyms: Vec<String>) -> Self {
Self { keyword, synonyms }
}
}
#[derive(Debug, Serialize)]
pub struct NewEntity {
name: String,
roles: Vec<String>,
lookups: Option<Vec<String>>,
keywords: Option<Vec<Keyword>>,
}
#[derive(Debug)]
pub struct NewEntityBuilder {
new_entity: NewEntity,
}
impl NewEntityBuilder {
pub fn new(name: String) -> Self {
Self {
new_entity: NewEntity {
name: name.clone(),
roles: vec![name],
lookups: None,
keywords: None,
},
}
}
pub fn roles(mut self, roles: Vec<String>) -> Self {
self.new_entity.roles = roles;
self
}
pub fn lookups(mut self, lookups: Vec<String>) -> Self {
self.new_entity.lookups = Some(lookups);
self
}
pub fn keywords(mut self, keywords: Vec<Keyword>) -> Self {
self.new_entity.keywords = Some(keywords);
self
}
pub fn build(self) -> NewEntity {
self.new_entity
}
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct EntityResponse {
pub id: String,
pub name: String,
pub roles: Vec<EntityRole>,
pub lookups: Option<Vec<String>>,
pub keywords: Option<Vec<Keyword>>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct EntityRole {
pub id: String,
pub name: String,
}
impl WitClient {
pub async fn get_entities(&self) -> Result<Vec<EntityBasic>, Error> {
self.make_request(Method::GET, "/entities", vec![], Option::<Value>::None)
.await
}
pub async fn create_entity(&self, new_entity: NewEntity) -> Result<EntityResponse, Error> {
self.make_request(Method::POST, "/entities", vec![], Some(new_entity))
.await
}
pub async fn get_entity(&self, entity_name: String) -> Result<EntityResponse, Error> {
let endpoint = format!("/entities/{}", entity_name);
self.make_request(Method::GET, &endpoint, vec![], Option::<Value>::None)
.await
}
pub async fn update_entity(
&self,
old_name: &str,
updated_entity: NewEntity,
) -> Result<EntityResponse, Error> {
let endpoint = format!("/entities/{}", old_name);
self.make_request(Method::PUT, &endpoint, vec![], Some(updated_entity))
.await
}
pub async fn delete_entity(&self, entity_name: &str) -> Result<DeleteResponse, Error> {
let endpoint = format!("/entities/{}", entity_name);
self.make_request(Method::DELETE, &endpoint, vec![], Option::<Value>::None)
.await
}
}