Rewrite from TypeScript to Rust
This commit is contained in:
parent
a8b8b549d0
commit
25d71ba0f2
29 changed files with 221685 additions and 232325 deletions
105
src/main.rs
Normal file
105
src/main.rs
Normal file
|
@ -0,0 +1,105 @@
|
|||
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);
|
||||
}
|
||||
}
|
Reference in a new issue