use crate::entity::{
ContentGenerationApiCheckGrammar, ContentGenerationApiCheckGrammarLanguage,
ContentGenerationApiGenerate, ContentGenerationApiGenerateMetaTags,
ContentGenerationApiGenerateSubTopics, ContentGenerationApiGenerateText,
ContentGenerationApiGrammarRules, ContentGenerationApiParaphrase,
ContentGenerationApiTextSummary, ContentGenerationApiTextSummaryLanguage,
};
use crate::{DataForSeoApiResponse, DataForSeoClient};
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub struct ContentGenerationApi<'a> {
client: &'a DataForSeoClient,
}
impl DataForSeoClient {
pub fn content_generation(&self) -> ContentGenerationApi<'_> {
ContentGenerationApi { client: self }
}
}
impl ContentGenerationApi<'_> {
pub async fn generate(
&self,
data: Vec<ContentGenerationApiGeneratePost>,
) -> DataForSeoApiResponse<ContentGenerationApiGenerate> {
self.client
.http_post("/v3/content_generation/generate/live", &data)
.await
}
pub async fn generate_text(
&self,
data: Vec<ContentGenerationApiGenerateTextPost>,
) -> DataForSeoApiResponse<ContentGenerationApiGenerateText> {
self.client
.http_post("/v3/content_generation/generate_text/live", &data)
.await
}
pub async fn generate_meta_tags(
&self,
data: Vec<ContentGenerationApiGenerateMetaTagsPost>,
) -> DataForSeoApiResponse<ContentGenerationApiGenerateMetaTags> {
self.client
.http_post("/v3/content_generation/generate_meta_tags/live", &data)
.await
}
pub async fn generate_sub_topics(
&self,
data: Vec<ContentGenerationApiGenerateSubTopicsPost>,
) -> DataForSeoApiResponse<ContentGenerationApiGenerateSubTopics> {
self.client
.http_post("/v3/content_generation/generate_sub_topics/live", &data)
.await
}
pub async fn paraphrase(
&self,
data: Vec<ContentGenerationApiParaphrasePost>,
) -> DataForSeoApiResponse<ContentGenerationApiParaphrase> {
self.client
.http_post("/v3/content_generation/paraphrase/live", &data)
.await
}
pub async fn check_grammar(
&self,
data: Vec<ContentGenerationApiCheckGrammarPost>,
) -> DataForSeoApiResponse<ContentGenerationApiCheckGrammar> {
self.client
.http_post("/v3/content_generation/check_grammar/live", &data)
.await
}
pub async fn check_grammar_languages(
&self,
) -> DataForSeoApiResponse<ContentGenerationApiCheckGrammarLanguage> {
self.client
.http_get("/v3/content_generation/check_grammar/languages")
.await
}
pub async fn grammar_rules(&self) -> DataForSeoApiResponse<ContentGenerationApiGrammarRules> {
self.client
.http_post("/v3/content_generation/grammar_rules", &Vec::<Value>::new())
.await
}
pub async fn text_summary(
&self,
data: Vec<ContentGenerationApiTextSummaryPost>,
) -> DataForSeoApiResponse<ContentGenerationApiTextSummary> {
self.client
.http_post("/v3/content_generation/text_summary/live", &data)
.await
}
pub async fn text_summary_languages(
&self,
) -> DataForSeoApiResponse<ContentGenerationApiTextSummaryLanguage> {
self.client
.http_get("/v3/content_generation/text_summary/languages")
.await
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ContentGenerationApiGeneratePost {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_new_tokens: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub creativity_index: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_repetition_penalty: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_k: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avoid_words: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avoid_starting_words: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop_words: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supplement_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl ContentGenerationApiGeneratePost {
pub fn new(text: &str) -> ContentGenerationApiGeneratePost {
ContentGenerationApiGeneratePost {
text: text.to_string(),
..Default::default()
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ContentGenerationApiGenerateTextPost {
pub topic: String,
pub word_count: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub sub_topics: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub meta_keywords: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub creativity_index: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_conclusion: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supplement_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl ContentGenerationApiGenerateTextPost {
pub fn new(topic: &str, word_count: i64) -> ContentGenerationApiGenerateTextPost {
ContentGenerationApiGenerateTextPost {
topic: topic.to_string(),
word_count,
..Default::default()
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ContentGenerationApiGenerateMetaTagsPost {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub creativity_index: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl ContentGenerationApiGenerateMetaTagsPost {
pub fn new(text: &str) -> ContentGenerationApiGenerateMetaTagsPost {
ContentGenerationApiGenerateMetaTagsPost {
text: text.to_string(),
..Default::default()
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ContentGenerationApiGenerateSubTopicsPost {
pub topic: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub creativity_index: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl ContentGenerationApiGenerateSubTopicsPost {
pub fn new(topic: &str) -> ContentGenerationApiGenerateSubTopicsPost {
ContentGenerationApiGenerateSubTopicsPost {
topic: topic.to_string(),
..Default::default()
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ContentGenerationApiParaphrasePost {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub creativity_index: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl ContentGenerationApiParaphrasePost {
pub fn new(text: &str) -> ContentGenerationApiParaphrasePost {
ContentGenerationApiParaphrasePost {
text: text.to_string(),
..Default::default()
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ContentGenerationApiCheckGrammarPost {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub language_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl ContentGenerationApiCheckGrammarPost {
pub fn new(text: &str) -> ContentGenerationApiCheckGrammarPost {
ContentGenerationApiCheckGrammarPost {
text: text.to_string(),
..Default::default()
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct ContentGenerationApiTextSummaryPost {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub language_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub internal_list_limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl ContentGenerationApiTextSummaryPost {
pub fn new(text: &str) -> ContentGenerationApiTextSummaryPost {
ContentGenerationApiTextSummaryPost {
text: text.to_string(),
..Default::default()
}
}
}