use serde::Deserialize;
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(from = "i32")]
pub enum Namespace {
Media,
Special,
Main,
Talk,
User,
UserTalk,
Wikipedia,
WikipediaTalk,
File,
FileTalk,
MediaWiki,
MediaWikiTalk,
Template,
TemplateTalk,
Help,
HelpTalk,
Category,
CategoryTalk,
Portal,
PortalTalk,
Draft,
DraftTalk,
TimedText,
TimedTextTalk,
Module,
ModuleTalk,
Gadget,
GadgetTalk,
GadgetDefinition,
GadgetDefinitionTalk,
Unknown,
}
impl Namespace {
pub fn to_int(&self) -> i32 {
match self {
Namespace::Media => -2,
Namespace::Special => -1,
Namespace::Main => 0,
Namespace::Talk => 1,
Namespace::User => 2,
Namespace::UserTalk => 3,
Namespace::Wikipedia => 4,
Namespace::WikipediaTalk => 5,
Namespace::File => 6,
Namespace::FileTalk => 7,
Namespace::MediaWiki => 8,
Namespace::MediaWikiTalk => 9,
Namespace::Template => 10,
Namespace::TemplateTalk => 11,
Namespace::Help => 12,
Namespace::HelpTalk => 13,
Namespace::Category => 14,
Namespace::CategoryTalk => 15,
Namespace::Portal => 100,
Namespace::PortalTalk => 101,
Namespace::Draft => 118,
Namespace::DraftTalk => 119,
Namespace::TimedText => 710,
Namespace::TimedTextTalk => 711,
Namespace::Module => 828,
Namespace::ModuleTalk => 829,
Namespace::Gadget => 2300,
Namespace::GadgetTalk => 2301,
Namespace::GadgetDefinition => 2302,
Namespace::GadgetDefinitionTalk => 2303,
Namespace::Unknown => -999,
}
}
}
impl From<i32> for Namespace {
fn from(id: i32) -> Self {
match id {
-2 => Namespace::Media,
-1 => Namespace::Special,
0 => Namespace::Main,
1 => Namespace::Talk,
2 => Namespace::User,
3 => Namespace::UserTalk,
4 => Namespace::Wikipedia,
5 => Namespace::WikipediaTalk,
6 => Namespace::File,
7 => Namespace::FileTalk,
8 => Namespace::MediaWiki,
9 => Namespace::MediaWikiTalk,
10 => Namespace::Template,
11 => Namespace::TemplateTalk,
12 => Namespace::Help,
13 => Namespace::HelpTalk,
14 => Namespace::Category,
15 => Namespace::CategoryTalk,
100 => Namespace::Portal,
101 => Namespace::PortalTalk,
118 => Namespace::Draft,
119 => Namespace::DraftTalk,
710 => Namespace::TimedText,
711 => Namespace::TimedTextTalk,
828 => Namespace::Module,
829 => Namespace::ModuleTalk,
2300 => Namespace::Gadget,
2301 => Namespace::GadgetTalk,
2302 => Namespace::GadgetDefinition,
2303 => Namespace::GadgetDefinitionTalk,
_ => Namespace::Unknown,
}
}
}
#[derive(Debug, Deserialize)]
pub struct Redirect {
#[serde(rename = "@title")]
pub title: String,
}
#[derive(Debug, Deserialize)]
pub struct Page {
pub title: String,
pub ns: Namespace,
pub id: u32,
#[serde(rename = "revision")]
pub revisions: Vec<Revision>,
pub redirect: Option<()>,
}
#[derive(Debug, Deserialize)]
pub struct Contributer {
pub username: Option<String>,
pub ip: Option<String>,
pub id: Option<u32>,
}
#[derive(Debug, Deserialize)]
pub struct Minor;
#[derive(Debug, Deserialize)]
pub struct Text {
#[serde(rename = "@bytes")]
pub bytes: i32,
#[serde(rename = "$value")]
pub text: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct Revision {
pub id: u32,
pub parentid: Option<u32>,
pub timestamp: String,
pub contributor: Contributer,
pub minor: Option<Minor>,
pub comment: Option<String>,
pub model: String,
pub format: String,
pub sha1: String,
pub text: Text,
}