#![allow(unused_crate_dependencies, reason = "Creates a lot of noise")]
#![allow(
non_snake_case,
unreachable_pub,
clippy::arithmetic_side_effects,
clippy::cast_lossless,
clippy::cast_precision_loss,
clippy::cognitive_complexity,
clippy::default_numeric_fallback,
clippy::exhaustive_enums,
clippy::exhaustive_structs,
clippy::expect_used,
clippy::indexing_slicing,
clippy::let_underscore_must_use,
clippy::let_underscore_untyped,
clippy::missing_assert_message,
clippy::missing_panics_doc,
clippy::mod_module_files,
clippy::must_use_candidate,
clippy::panic,
clippy::print_stdout,
clippy::tests_outside_test_module,
clippy::too_many_lines,
clippy::unwrap_in_result,
clippy::unwrap_used,
reason = "Not useful in examples"
)]
#[expect(unused, reason = "Shared test code")]
#[path = "../tests/common/mod.rs"]
mod common;
use common::server::{initialize, create_patchify_api_server, patchify_api_routes};
use core::net::{IpAddr, SocketAddr};
use figment::{
Figment,
providers::{Env, Format as _, Serialized, Toml},
};
use rubedo::crypto::Sha256Hash;
use semver::Version;
use serde::{Deserialize, Serialize};
use smart_default::SmartDefault;
use std::{
collections::HashMap,
path::PathBuf,
};
use tokio::signal;
#[derive(Debug, Deserialize, Serialize, SmartDefault)]
pub struct Config {
#[default = "example"]
pub appname: String,
#[default(IpAddr::from([127, 0, 0, 1]))]
pub host: IpAddr,
#[default = 8000]
pub port: u16,
#[default = "releases"]
pub releases: String,
#[default(HashMap::new())]
pub versions: HashMap<Version, Sha256Hash>,
}
#[tokio::main]
async fn main() {
initialize();
let config: Config = Figment::from(Serialized::defaults(Config::default()))
.merge(Toml::file("axum-server.toml"))
.merge(Env::raw())
.extract()
.expect("Error loading config")
;
let _address = create_patchify_api_server(
&config.appname,
SocketAddr::from((config.host, config.port)),
patchify_api_routes(),
PathBuf::from(config.releases),
config.versions,
);
signal::ctrl_c().await.unwrap();
println!("Shutting down");
}