105 lines
2.6 KiB
Rust
105 lines
2.6 KiB
Rust
mod cli;
|
|
mod manifest;
|
|
mod missing;
|
|
mod resource;
|
|
mod schema;
|
|
mod steam;
|
|
mod wiki;
|
|
|
|
use crate::{
|
|
manifest::{Manifest, ManifestOverride},
|
|
resource::ResourceFile,
|
|
steam::SteamCache,
|
|
wiki::{WikiCache, WikiMetaCache},
|
|
};
|
|
|
|
pub const REPO: &str = env!("CARGO_MANIFEST_DIR");
|
|
|
|
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub enum State {
|
|
/// This entry needs to be re-fetched from the data source.
|
|
Outdated,
|
|
/// This entry has been re-fetched, but is awaiting recognition by another step.
|
|
Updated,
|
|
/// This entry has been fully processed.
|
|
#[default]
|
|
Handled,
|
|
}
|
|
|
|
impl State {
|
|
pub fn is_handled(&self) -> bool {
|
|
*self == Self::Handled
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, thiserror::Error)]
|
|
pub enum Error {
|
|
#[error("Wiki client: {0}")]
|
|
WikiClient(#[from] mediawiki::media_wiki_error::MediaWikiError),
|
|
#[error("Wiki data missing or malformed: {0}")]
|
|
WikiData(&'static str),
|
|
#[error("Unable to find page by title or ID")]
|
|
PageMissing,
|
|
#[error("Could not find product info")]
|
|
SteamProductInfo,
|
|
#[error("Schema validation failed for manifest")]
|
|
ManifestSchema,
|
|
#[error("Subprocess: {0}")]
|
|
Subprocess(#[from] std::io::Error),
|
|
}
|
|
|
|
impl Error {
|
|
pub fn should_discard_work(&self) -> bool {
|
|
match self {
|
|
Error::WikiClient(_)
|
|
| Error::WikiData(_)
|
|
| Error::PageMissing
|
|
| Error::SteamProductInfo
|
|
| Error::Subprocess(_) => false,
|
|
Error::ManifestSchema => true,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let cli = cli::parse();
|
|
|
|
let mut wiki_cache = WikiCache::load().unwrap();
|
|
let mut wiki_meta_cache = WikiMetaCache::load().unwrap();
|
|
let mut steam_cache = SteamCache::load().unwrap();
|
|
let mut manifest = Manifest::load().unwrap();
|
|
let mut manifest_override = ManifestOverride::load().unwrap();
|
|
|
|
let mut success = true;
|
|
let mut discard = false;
|
|
if let Err(e) = cli::run(
|
|
cli.sub,
|
|
&mut manifest,
|
|
&mut manifest_override,
|
|
&mut wiki_cache,
|
|
&mut wiki_meta_cache,
|
|
&mut steam_cache,
|
|
)
|
|
.await
|
|
{
|
|
eprintln!("{e}");
|
|
success = false;
|
|
discard = e.should_discard_work();
|
|
}
|
|
|
|
if !discard {
|
|
if success {
|
|
wiki_meta_cache.save();
|
|
}
|
|
wiki_cache.save();
|
|
steam_cache.save();
|
|
manifest.save();
|
|
missing::save_missing_games(&wiki_cache, &manifest, &manifest_override);
|
|
}
|
|
|
|
if !success {
|
|
std::process::exit(1);
|
|
}
|
|
}
|