#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Region {
XaAr,
XaEn,
ArEs,
AuEn,
AtDe,
BeFr,
BeNl,
BrPt,
BgBg,
CaEn,
CaFr,
CtCa,
ClEs,
CnZh,
CoEs,
HrHr,
CzCs,
DkDa,
EeEt,
FiFi,
FrFr,
DeDe,
GrEl,
HkTzh,
HuHu,
InEn,
IdId,
IdEn,
IeEn,
IlHe,
ItIt,
JpJp,
KrKr,
LvLv,
LtLt,
XlEs,
MyMs,
MyEn,
MxEs,
NlNl,
NzEn,
NoNo,
PeEs,
PhEn,
PhTl,
PlPl,
PtPt,
RoRo,
RuRu,
SgEn,
SkSk,
SlSl,
ZaEn,
EsEs,
SeSv,
ChDe,
ChFr,
ChIt,
TwTzh,
ThTh,
TrTr,
UaUk,
UkEn,
UsEn,
UeEs,
VeEs,
VnVi,
WtWt,
}
impl Region {
pub fn as_str(&self) -> &'static str {
match self {
Region::XaAr => "xa-ar",
Region::XaEn => "xa-en",
Region::ArEs => "ar-es",
Region::AuEn => "au-en",
Region::AtDe => "at-de",
Region::BeFr => "be-fr",
Region::BeNl => "be-nl",
Region::BrPt => "br-pt",
Region::BgBg => "bg-bg",
Region::CaEn => "ca-en",
Region::CaFr => "ca-fr",
Region::CtCa => "ct-ca",
Region::ClEs => "cl-es",
Region::CnZh => "cn-zh",
Region::CoEs => "co-es",
Region::HrHr => "hr-hr",
Region::CzCs => "cz-cs",
Region::DkDa => "dk-da",
Region::EeEt => "ee-et",
Region::FiFi => "fi-fi",
Region::FrFr => "fr-fr",
Region::DeDe => "de-de",
Region::GrEl => "gr-el",
Region::HkTzh => "hk-tzh",
Region::HuHu => "hu-hu",
Region::InEn => "in-en",
Region::IdId => "id-id",
Region::IdEn => "id-en",
Region::IeEn => "ie-en",
Region::IlHe => "il-he",
Region::ItIt => "it-it",
Region::JpJp => "jp-jp",
Region::KrKr => "kr-kr",
Region::LvLv => "lv-lv",
Region::LtLt => "lt-lt",
Region::XlEs => "xl-es",
Region::MyMs => "my-ms",
Region::MyEn => "my-en",
Region::MxEs => "mx-es",
Region::NlNl => "nl-nl",
Region::NzEn => "nz-en",
Region::NoNo => "no-no",
Region::PeEs => "pe-es",
Region::PhEn => "ph-en",
Region::PhTl => "ph-tl",
Region::PlPl => "pl-pl",
Region::PtPt => "pt-pt",
Region::RoRo => "ro-ro",
Region::RuRu => "ru-ru",
Region::SgEn => "sg-en",
Region::SkSk => "sk-sk",
Region::SlSl => "sl-sl",
Region::ZaEn => "za-en",
Region::EsEs => "es-es",
Region::SeSv => "se-sv",
Region::ChDe => "ch-de",
Region::ChFr => "ch-fr",
Region::ChIt => "ch-it",
Region::TwTzh => "tw-tzh",
Region::ThTh => "th-th",
Region::TrTr => "tr-tr",
Region::UaUk => "ua-uk",
Region::UkEn => "uk-en",
Region::UsEn => "us-en",
Region::UeEs => "ue-es",
Region::VeEs => "ve-es",
Region::VnVi => "vn-vi",
Region::WtWt => "wt-wt",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SafeSearch {
On,
Moderate,
Off,
}
impl SafeSearch {
pub fn as_str(&self) -> &'static str {
match self {
SafeSearch::On => "1",
SafeSearch::Moderate => "-1",
SafeSearch::Off => "-2",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Toggle {
On,
Off,
}
impl Toggle {
pub fn as_str(&self) -> &'static str {
match self {
Toggle::On => "1",
Toggle::Off => "-1",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AddressBar {
Get,
Post,
}
impl AddressBar {
pub fn as_str(&self) -> &'static str {
match self {
AddressBar::Get => "g",
AddressBar::Post => "p",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum VideoPlayback {
AlwaysOnDdg,
ThirdPartySite,
Prompt,
}
impl VideoPlayback {
pub fn as_str(&self) -> &'static str {
match self {
VideoPlayback::AlwaysOnDdg => "1",
VideoPlayback::ThirdPartySite => "2",
VideoPlayback::Prompt => "-1",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Favicons {
JustFavicons,
JustWot,
WotAndFavicons,
Off,
}
impl Favicons {
pub fn as_str(&self) -> &'static str {
match self {
Favicons::JustFavicons => "1",
Favicons::JustWot => "w",
Favicons::WotAndFavicons => "fw",
Favicons::Off => "-1",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Theme {
Default,
Contrast,
Retro,
Dark,
Terminal,
Custom(String),
}
impl Theme {
pub fn as_string(&self) -> String {
match self {
Theme::Default => "-1".to_string(),
Theme::Contrast => "c".to_string(),
Theme::Retro => "r".to_string(),
Theme::Dark => "d".to_string(),
Theme::Terminal => "t".to_string(),
Theme::Custom(code) => code.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Size {
Large,
Larger,
Largest,
Medium,
Small,
}
impl Size {
pub fn as_str(&self) -> &'static str {
match self {
Size::Large => "n",
Size::Larger => "l",
Size::Largest => "t",
Size::Medium => "m",
Size::Small => "s",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Width {
Normal,
Wide,
SuperWide,
}
impl Width {
pub fn as_str(&self) -> &'static str {
match self {
Width::Normal => "n",
Width::Wide => "w",
Width::SuperWide => "s",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Placement {
Middle,
Left,
}
impl Placement {
pub fn as_str(&self) -> &'static str {
match self {
Placement::Middle => "m",
Placement::Left => "l",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Font {
Arial,
CenturyGothic,
Georgia,
Helvetica,
ProximaNova,
SansSerif,
SegoeUi,
Serif,
Tahoma,
Times,
TrebuchetMs,
Verdana,
Custom(String),
}
impl Font {
pub fn as_string(&self) -> String {
match self {
Font::Arial => "a".to_string(),
Font::CenturyGothic => "c".to_string(),
Font::Georgia => "g".to_string(),
Font::Helvetica => "h".to_string(),
Font::ProximaNova => "p".to_string(),
Font::SansSerif => "n".to_string(),
Font::SegoeUi => "e".to_string(),
Font::Serif => "s".to_string(),
Font::Tahoma => "o".to_string(),
Font::Times => "t".to_string(),
Font::TrebuchetMs => "b".to_string(),
Font::Verdana => "v".to_string(),
Font::Custom(name) => name.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum HeaderBehavior {
OnFloating,
OnScrolling,
OffExceptInstant,
Off,
}
impl HeaderBehavior {
pub fn as_str(&self) -> &'static str {
match self {
HeaderBehavior::OnFloating => "1",
HeaderBehavior::OnScrolling => "s",
HeaderBehavior::OffExceptInstant => "-1",
HeaderBehavior::Off => "-2",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PageNumbers {
On,
OnNoNumbers,
Off,
}
impl PageNumbers {
pub fn as_str(&self) -> &'static str {
match self {
PageNumbers::On => "1",
PageNumbers::OnNoNumbers => "n",
PageNumbers::Off => "-1",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum UnitsMeasure {
On,
OnNoNumbers,
Off,
}
impl UnitsMeasure {
pub fn as_str(&self) -> &'static str {
match self {
UnitsMeasure::On => "1",
UnitsMeasure::OnNoNumbers => "n",
UnitsMeasure::Off => "-1",
}
}
}
#[derive(Debug, Clone, Default)]
pub struct SearchParams {
region: Option<Region>,
safe_search: Option<SafeSearch>,
open_instant_answers: Option<Toggle>,
auto_load_images: Option<Toggle>,
auto_load_results: Option<Toggle>,
new_window: Option<Toggle>,
favicons: Option<Favicons>,
full_urls: Option<Toggle>,
auto_suggest: Option<Toggle>,
redirect: Option<Toggle>,
https: Option<Toggle>,
address_bar: Option<AddressBar>,
video_playback: Option<VideoPlayback>,
header_color: Option<String>,
url_color: Option<String>,
background_color: Option<String>,
text_color: Option<String>,
link_color: Option<String>,
visited_link_color: Option<String>,
theme: Option<Theme>,
size: Option<Size>,
width: Option<Width>,
placement: Option<Placement>,
link_font: Option<Font>,
underline: Option<Toggle>,
text_font: Option<Font>,
header_behavior: Option<HeaderBehavior>,
advertisements: Option<Toggle>,
page_numbers: Option<PageNumbers>,
units_measure: Option<UnitsMeasure>,
source: Option<String>,
}
impl SearchParams {
pub fn new() -> Self {
Self::default()
}
pub fn region(mut self, region: Region) -> Self {
self.region = Some(region);
self
}
pub fn safe_search(mut self, safe_search: SafeSearch) -> Self {
self.safe_search = Some(safe_search);
self
}
pub fn open_instant_answers(mut self, toggle: Toggle) -> Self {
self.open_instant_answers = Some(toggle);
self
}
pub fn auto_load_images(mut self, toggle: Toggle) -> Self {
self.auto_load_images = Some(toggle);
self
}
pub fn auto_load_results(mut self, toggle: Toggle) -> Self {
self.auto_load_results = Some(toggle);
self
}
pub fn new_window(mut self, toggle: Toggle) -> Self {
self.new_window = Some(toggle);
self
}
pub fn favicons(mut self, favicons: Favicons) -> Self {
self.favicons = Some(favicons);
self
}
pub fn full_urls(mut self, toggle: Toggle) -> Self {
self.full_urls = Some(toggle);
self
}
pub fn auto_suggest(mut self, toggle: Toggle) -> Self {
self.auto_suggest = Some(toggle);
self
}
pub fn redirect(mut self, toggle: Toggle) -> Self {
self.redirect = Some(toggle);
self
}
pub fn https(mut self, toggle: Toggle) -> Self {
self.https = Some(toggle);
self
}
pub fn address_bar(mut self, address_bar: AddressBar) -> Self {
self.address_bar = Some(address_bar);
self
}
pub fn video_playback(mut self, video_playback: VideoPlayback) -> Self {
self.video_playback = Some(video_playback);
self
}
pub fn header_color(mut self, color: impl Into<String>) -> Self {
self.header_color = Some(color.into());
self
}
pub fn url_color(mut self, color: impl Into<String>) -> Self {
self.url_color = Some(color.into());
self
}
pub fn background_color(mut self, color: impl Into<String>) -> Self {
self.background_color = Some(color.into());
self
}
pub fn text_color(mut self, color: impl Into<String>) -> Self {
self.text_color = Some(color.into());
self
}
pub fn link_color(mut self, color: impl Into<String>) -> Self {
self.link_color = Some(color.into());
self
}
pub fn visited_link_color(mut self, color: impl Into<String>) -> Self {
self.visited_link_color = Some(color.into());
self
}
pub fn theme(mut self, theme: Theme) -> Self {
self.theme = Some(theme);
self
}
pub fn size(mut self, size: Size) -> Self {
self.size = Some(size);
self
}
pub fn width(mut self, width: Width) -> Self {
self.width = Some(width);
self
}
pub fn placement(mut self, placement: Placement) -> Self {
self.placement = Some(placement);
self
}
pub fn link_font(mut self, font: Font) -> Self {
self.link_font = Some(font);
self
}
pub fn underline(mut self, toggle: Toggle) -> Self {
self.underline = Some(toggle);
self
}
pub fn text_font(mut self, font: Font) -> Self {
self.text_font = Some(font);
self
}
pub fn header_behavior(mut self, behavior: HeaderBehavior) -> Self {
self.header_behavior = Some(behavior);
self
}
pub fn advertisements(mut self, toggle: Toggle) -> Self {
self.advertisements = Some(toggle);
self
}
pub fn page_numbers(mut self, page_numbers: PageNumbers) -> Self {
self.page_numbers = Some(page_numbers);
self
}
pub fn units_measure(mut self, units: UnitsMeasure) -> Self {
self.units_measure = Some(units);
self
}
pub fn source(mut self, source: impl Into<String>) -> Self {
self.source = Some(source.into());
self
}
pub fn to_query_pairs(&self) -> Vec<(&'static str, String)> {
let mut pairs: Vec<(&'static str, String)> = Vec::new();
if let Some(ref r) = self.region {
pairs.push(("kl", r.as_str().to_string()));
}
if let Some(ref s) = self.safe_search {
pairs.push(("kp", s.as_str().to_string()));
}
if let Some(ref t) = self.open_instant_answers {
pairs.push(("kz", t.as_str().to_string()));
}
if let Some(ref t) = self.auto_load_images {
pairs.push(("kc", t.as_str().to_string()));
}
if let Some(ref t) = self.auto_load_results {
pairs.push(("kav", t.as_str().to_string()));
}
if let Some(ref t) = self.new_window {
pairs.push(("kn", t.as_str().to_string()));
}
if let Some(ref f) = self.favicons {
pairs.push(("kf", f.as_str().to_string()));
}
if let Some(ref t) = self.full_urls {
pairs.push(("kaf", t.as_str().to_string()));
}
if let Some(ref t) = self.auto_suggest {
pairs.push(("kac", t.as_str().to_string()));
}
if let Some(ref t) = self.redirect {
pairs.push(("kd", t.as_str().to_string()));
}
if let Some(ref t) = self.https {
pairs.push(("kh", t.as_str().to_string()));
}
if let Some(ref ab) = self.address_bar {
pairs.push(("kg", ab.as_str().to_string()));
}
if let Some(ref vp) = self.video_playback {
pairs.push(("k5", vp.as_str().to_string()));
}
if let Some(ref c) = self.header_color {
pairs.push(("kj", c.clone()));
}
if let Some(ref c) = self.url_color {
pairs.push(("kx", c.clone()));
}
if let Some(ref c) = self.background_color {
pairs.push(("k7", c.clone()));
}
if let Some(ref c) = self.text_color {
pairs.push(("k8", c.clone()));
}
if let Some(ref c) = self.link_color {
pairs.push(("k9", c.clone()));
}
if let Some(ref c) = self.visited_link_color {
pairs.push(("kaa", c.clone()));
}
if let Some(ref t) = self.theme {
pairs.push(("kae", t.as_string()));
}
if let Some(ref s) = self.size {
pairs.push(("ks", s.as_str().to_string()));
}
if let Some(ref w) = self.width {
pairs.push(("kw", w.as_str().to_string()));
}
if let Some(ref p) = self.placement {
pairs.push(("km", p.as_str().to_string()));
}
if let Some(ref f) = self.link_font {
pairs.push(("ka", f.as_string()));
}
if let Some(ref t) = self.underline {
pairs.push(("ku", t.as_str().to_string()));
}
if let Some(ref f) = self.text_font {
pairs.push(("kt", f.as_string()));
}
if let Some(ref h) = self.header_behavior {
pairs.push(("ko", h.as_str().to_string()));
}
if let Some(ref t) = self.advertisements {
pairs.push(("k1", t.as_str().to_string()));
}
if let Some(ref p) = self.page_numbers {
pairs.push(("kv", p.as_str().to_string()));
}
if let Some(ref u) = self.units_measure {
pairs.push(("kaj", u.as_str().to_string()));
}
if let Some(ref s) = self.source {
pairs.push(("t", s.clone()));
}
pairs
}
}