use crate::{ApiClient, Result};
use mwtitle::{
SiteInfo as TitleSiteInfo, SiteInfoResponse as TitleSiteInfoResponse,
};
use serde::{de::Error, Deserialize, Deserializer};
#[derive(Debug, Deserialize)]
pub(crate) struct Response {
pub(crate) query: SiteInfo,
}
#[derive(Clone, Debug, Deserialize)]
pub(crate) struct SiteInfo {
pub(crate) general: General,
}
#[derive(Clone, Debug, Deserialize)]
pub(crate) struct General {
#[serde(rename = "generator")]
#[serde(deserialize_with = "deserialize_version")]
pub(crate) version: String,
#[serde(rename = "servername")]
pub(crate) server_name: String,
#[serde(rename = "wikiid")]
pub(crate) wiki_id: String,
}
fn deserialize_version<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
s.strip_prefix("MediaWiki ")
.map(|stripped| stripped.to_string())
.ok_or_else(|| {
D::Error::custom(
"string does not start with required prefix 'MediaWiki '",
)
})
}
pub(crate) async fn get_siteinfo(
api: &ApiClient,
) -> Result<(SiteInfo, TitleSiteInfo)> {
let resp = api
.get_value(&[
("action", "query"),
("meta", "siteinfo"),
("siprop", "general|namespaces|namespacealiases|interwikimap"),
])
.await?;
let site_info: Response = serde_json::from_value(resp.clone())?;
let title_site_info: TitleSiteInfoResponse = serde_json::from_value(resp)?;
Ok((site_info.query, title_site_info.query))
}