| Crates.io | semanticpen |
| lib.rs | semanticpen |
| version | 0.1.0 |
| created_at | 2025-07-19 15:15:11.669925+00 |
| updated_at | 2025-07-19 15:15:11.669925+00 |
| description | Official Rust SDK for SemanticPen API - AI-powered content generation |
| homepage | https://www.semanticpen.com |
| repository | https://github.com/pushkarsingh32/semanticpen-rust-sdk |
| max_upload_size | |
| id | 1760313 |
| size | 68,948 |
Official Rust SDK for the SemanticPen API - AI-powered content generation made simple.
Add this to your Cargo.toml:
[dependencies]
semanticpen = "0.1.0"
use semanticpen::{SemanticPenClient, ClientConfig};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create client
let client = SemanticPenClient::new("your-api-key-here".to_string())?;
// Generate article
let response = client.generate_article("rust programming tutorial", None).await?;
// Get article ID
if let Some(article_id) = response.get_article_id() {
println!("Article ID: {}", article_id);
// Wait for completion
let article = client.wait_for_article(&article_id, None).await?;
println!("Status: {}", article.status);
if let Some(html) = article.article_html {
println!("Content length: {}", html.len());
}
}
Ok(())
}
use semanticpen::{SemanticPenClient, ClientConfig};
let config = ClientConfig {
base_url: "https://www.semanticpen.com".to_string(),
timeout_seconds: 60,
debug: true,
};
let client = SemanticPenClient::with_config("your-api-key".to_string(), config)?;
generate_article(target_keyword, project_name)Generate a single article.
let response = client.generate_article("rust tutorial", Some("My Project")).await?;
get_article(article_id)Get article status and content.
let article = client.get_article("article-123").await?;
wait_for_article(article_id, polling_config)Wait for article completion with polling.
use semanticpen::PollingConfig;
let config = PollingConfig {
interval_seconds: 5,
max_attempts: 60,
};
let article = client.wait_for_article("article-123", Some(config)).await?;
generate_article_and_wait(target_keyword, project_name, polling_config)Generate and wait for completion in one call.
let article = client.generate_article_and_wait(
"rust tutorial",
Some("My Project"),
None
).await?;
generate_bulk_articles(keywords, project_name)Generate multiple articles.
let keywords = vec!["rust tutorial".to_string(), "async rust".to_string()];
let article_ids = client.generate_bulk_articles(&keywords, None).await?;
Articlepub struct Article {
pub id: String,
pub target_keyword: String,
pub status: String,
pub progress: u8,
pub article_html: Option<String>,
pub error_message: Option<String>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
}
GenerateArticleResponsepub struct GenerateArticleResponse {
pub article_id: Option<String>,
pub article_ids: Option<Vec<String>>,
pub project_id: String,
pub message: String,
pub processing_info: Option<String>,
pub error: Option<String>,
}
The SDK uses SemanticPenError for all error cases:
use semanticpen::SemanticPenError;
match client.generate_article("test", None).await {
Ok(response) => println!("Success!"),
Err(SemanticPenError::Api { status, message }) => {
println!("API Error {}: {}", status, message);
}
Err(SemanticPenError::RateLimit { message }) => {
println!("Rate limited: {}", message);
}
Err(e) => println!("Other error: {}", e),
}
Check the examples/ directory for complete examples:
simple.rs - Basic article generationbulk.rs - Bulk article generationRun examples:
cargo run --example simple
cargo run --example bulk
MIT License - see LICENSE file for details.