Yoda 0.9.2

Browser for Gemini Protocol
use gtk::glib::{GString, Uri, UriFlags};

/// Request type for `Page` with optional value parsed
pub enum Request {
    Default(Uri),
    Download(Uri),
    Source(Uri),
    Search(String),
}

impl Request {
    // Constructors

    /// Create new `Self` from `request` string
    /// * if some `referrer` given, make additional check in previous request
    pub fn from(request: &str, referrer: Option<&GString>) -> Self {
        // check in request
        if let Some(postfix) = request.strip_prefix("source:") {
            if let Ok(uri) = Uri::parse(postfix, UriFlags::NONE) {
                return Self::Source(uri);
            }
        }

        if let Some(postfix) = request.strip_prefix("download:") {
            if let Ok(uri) = Uri::parse(postfix, UriFlags::NONE) {
                return Self::Download(uri);
            }
        }

        // check in referrer @TODO tmp
        if referrer.is_some_and(|this| this.starts_with("source:")) {
            if let Ok(uri) = Uri::parse(request, UriFlags::NONE) {
                return Self::Source(uri);
            }
        }

        if referrer.is_some_and(|this| this.starts_with("download:")) {
            if let Ok(uri) = Uri::parse(request, UriFlags::NONE) {
                return Self::Download(uri);
            }
        }

        // is default
        if let Ok(uri) = Uri::parse(request, UriFlags::NONE) {
            return Self::Default(uri);
        }

        // is search
        Self::Search(request.to_string())
    }
}