browsr-types 0.4.0

Shared data models and schemas for Browsr browser automation flows.
Documentation
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};

use super::{CommandResult, Commands};

/// Crawl command parameters
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
pub struct ScrapeOptions {
    pub url: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub use_js: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub wait_for: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub extract_links: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub selector: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub extract_images: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub extract_metadata: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub extract_tables: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub extract_forms: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub extract_structured_data: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub readable_content: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub remove_base64_images: Option<bool>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CrawlResponse {
    pub success: bool,
    pub command: String,
    pub data: Option<CrawlData>,
    pub error: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CrawlData {
    pub url: String,
    pub title: String,
    pub content: Option<String>,
    pub readable_content: Option<serde_json::Value>,
    pub links: Option<Vec<serde_json::Value>>,
    pub links_count: usize,
    pub images: Option<Vec<serde_json::Value>>,
    pub images_count: usize,
    pub metadata: Option<serde_json::Value>,
    pub tables: Option<Vec<serde_json::Value>>,
    pub forms: Option<Vec<serde_json::Value>>,
    pub structured_data: Option<Vec<serde_json::Value>>,
    pub content_error: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct AutomateResponse {
    pub success: bool,
    pub steps_completed: usize,
    pub total_steps: usize,
    pub results: Vec<CommandResult>,
    /// Error message from the first failed command, if any
    #[serde(skip_serializing_if = "Option::is_none")]
    pub error: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
pub struct BrowserToolOptions {
    pub commands: Vec<Commands>,
    pub context: Option<BrowserContext>,
}

impl From<Commands> for BrowserToolOptions {
    fn from(command: Commands) -> Self {
        BrowserToolOptions {
            commands: vec![command],
            context: None,
        }
    }
}

/// Context to enrich structured extraction calls with thread metadata and model settings
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
pub struct BrowserContext {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub thread_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub task_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub run_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub model_settings: Option<serde_json::Value>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub distri_client_config: Option<serde_json::Value>,
}