oratos 0.3.1

Website visibility intelligence for SEO, accessibility, structured metadata, and AI readiness.
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HtmlPage {
    pub url_or_path: String,
    pub source: String,
    pub title: Option<String>,
    pub meta_description: Option<String>,
    pub canonical_urls: Vec<String>,
    pub language: Option<String>,
    pub headings: Vec<Heading>,
    pub links: Vec<LinkInfo>,
    pub images: Vec<ImageInfo>,
    pub open_graph: OpenGraphTags,
    pub twitter_card: TwitterCardTags,
    pub json_ld_blocks: Vec<JsonLdBlock>,
    pub main_text: String,
    pub has_main_landmark: bool,
    pub forms: Vec<FormInfo>,
    pub breadcrumbs_detected: bool,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Heading {
    pub level: u8,
    pub text: String,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LinkInfo {
    pub href: String,
    pub text: String,
    pub is_internal: bool,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ImageInfo {
    pub src: String,
    pub alt: Option<String>,
    pub width: Option<String>,
    pub height: Option<String>,
    pub has_caption: bool,
}

#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct OpenGraphTags {
    pub title: Option<String>,
    pub description: Option<String>,
    pub image: Option<String>,
    pub url: Option<String>,
    pub type_: Option<String>,
}

#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct TwitterCardTags {
    pub card: Option<String>,
    pub title: Option<String>,
    pub description: Option<String>,
    pub image: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct JsonLdBlock {
    pub raw: String,
    pub valid_json: bool,
    pub types: Vec<String>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FormInfo {
    pub id: Option<String>,
    pub inputs_without_label: Vec<String>,
}

impl HtmlPage {
    pub fn display_name(&self) -> &str {
        self.title
            .as_deref()
            .filter(|t| !t.is_empty())
            .unwrap_or(&self.url_or_path)
    }
}