sarvam-rs 0.2.0

Rust SDK for Sarvam AI APIs — chat, translation, speech-to-text, text-to-speech, transliteration, and language identification
Documentation
use std::collections::HashMap;

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum StorageContainerType {
    Azure,
    Local,
    Google,
    #[serde(rename = "Azure_V1")]
    AzureV1,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum JobState {
    Accepted,
    Pending,
    Running,
    Completed,
    #[serde(rename = "PartiallyCompleted")]
    PartiallyCompleted,
    Failed,
}

impl JobState {
    pub fn is_terminal(&self) -> bool {
        matches!(
            self,
            JobState::Completed | JobState::PartiallyCompleted | JobState::Failed
        )
    }

    pub fn is_success_like(&self) -> bool {
        matches!(self, JobState::Completed | JobState::PartiallyCompleted)
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkJobCallback {
    pub url: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub auth_token: Option<String>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FileMetadata {
    #[serde(rename = "contentType", skip_serializing_if = "Option::is_none")]
    pub content_type: Option<String>,
    #[serde(rename = "fileSizeBytes", skip_serializing_if = "Option::is_none")]
    pub file_size_bytes: Option<u64>,
    #[serde(rename = "lastModified", skip_serializing_if = "Option::is_none")]
    pub last_modified: Option<String>,
    #[serde(flatten)]
    pub extra: HashMap<String, serde_json::Value>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PresignedFileAccess {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub file_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub upload_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub file_metadata: Option<FileMetadata>,
    #[serde(flatten)]
    pub extra: HashMap<String, serde_json::Value>,
}

impl PresignedFileAccess {
    pub fn url(&self) -> Option<&str> {
        self.file_url
            .as_deref()
            .or(self.upload_url.as_deref())
            .or(self.url.as_deref())
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JobFileRef {
    pub file_name: String,
    pub file_id: String,
    #[serde(flatten)]
    pub extra: HashMap<String, serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JobDetail {
    #[serde(default)]
    pub inputs: Vec<JobFileRef>,
    #[serde(default)]
    pub outputs: Vec<JobFileRef>,
    pub state: String,
    #[serde(default)]
    pub error_message: Option<String>,
    #[serde(default)]
    pub exception_name: Option<String>,
    #[serde(default)]
    pub total_pages: Option<u32>,
    #[serde(default)]
    pub pages_processed: Option<u32>,
    #[serde(default)]
    pub pages_succeeded: Option<u32>,
    #[serde(default)]
    pub pages_failed: Option<u32>,
    #[serde(default)]
    pub page_errors: Option<Vec<serde_json::Value>>,
    #[serde(flatten)]
    pub extra: HashMap<String, serde_json::Value>,
}

impl JobDetail {
    pub fn primary_input_file_name(&self) -> Option<&str> {
        self.inputs.first().map(|input| input.file_name.as_str())
    }
}