perf: speed-up musicDB load
This commit is contained in:
@@ -4,12 +4,13 @@ use nyquest::{AsyncClient, Body, Request, header::USER_AGENT};
|
|||||||
|
|
||||||
mod model;
|
mod model;
|
||||||
use model::{GetResponse, GetUserId};
|
use model::{GetResponse, GetUserId};
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
pub struct QRCode<'a> {
|
pub struct QRCode<'a> {
|
||||||
pub qrcode_content: &'a str,
|
pub qrcode_content: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, snafu::Snafu)]
|
#[derive(Debug, snafu::Snafu, Serialize)]
|
||||||
pub enum QRLoginError {
|
pub enum QRLoginError {
|
||||||
#[snafu(display("QRCode expired [10mins]"))]
|
#[snafu(display("QRCode expired [10mins]"))]
|
||||||
QRCodeExpired10,
|
QRCodeExpired10,
|
||||||
@@ -23,13 +24,17 @@ pub enum QRLoginError {
|
|||||||
#[snafu(context(false))]
|
#[snafu(context(false))]
|
||||||
#[snafu(display("request error: {source}"))]
|
#[snafu(display("request error: {source}"))]
|
||||||
NyquestError {
|
NyquestError {
|
||||||
|
#[serde(skip)]
|
||||||
source: nyquest::Error,
|
source: nyquest::Error,
|
||||||
|
#[serde(skip)]
|
||||||
backtrace: Backtrace,
|
backtrace: Backtrace,
|
||||||
},
|
},
|
||||||
|
|
||||||
#[snafu(context(false))]
|
#[snafu(context(false))]
|
||||||
JSONError {
|
JSONError {
|
||||||
|
#[serde(skip)]
|
||||||
source: serde_json::error::Error,
|
source: serde_json::error::Error,
|
||||||
|
#[serde(skip)]
|
||||||
backtrace: Backtrace,
|
backtrace: Backtrace,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use std::{fs::OpenOptions, sync::LazyLock};
|
use std::{fs::OpenOptions, io::BufReader, sync::LazyLock, time::SystemTime};
|
||||||
|
|
||||||
use rust_decimal::{Decimal, dec, serde::DecimalFromString};
|
use rust_decimal::{Decimal, dec, serde::DecimalFromString};
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
@@ -26,6 +26,7 @@ pub struct Level {
|
|||||||
type MusicDB = FxHashMap<u32, MusicInfo>;
|
type MusicDB = FxHashMap<u32, MusicInfo>;
|
||||||
|
|
||||||
pub static MUSIC_DB: LazyLock<Option<MusicDB>> = LazyLock::new(|| {
|
pub static MUSIC_DB: LazyLock<Option<MusicDB>> = LazyLock::new(|| {
|
||||||
|
let time = SystemTime::now();
|
||||||
info!("loading musicDB...");
|
info!("loading musicDB...");
|
||||||
|
|
||||||
let json = OpenOptions::new()
|
let json = OpenOptions::new()
|
||||||
@@ -34,11 +35,17 @@ pub static MUSIC_DB: LazyLock<Option<MusicDB>> = LazyLock::new(|| {
|
|||||||
.open("musicDB.json")
|
.open("musicDB.json")
|
||||||
.inspect_err(|e| warn!("failed to load musicDB: {e}"))
|
.inspect_err(|e| warn!("failed to load musicDB: {e}"))
|
||||||
.ok()?;
|
.ok()?;
|
||||||
|
let buf_reader = BufReader::new(json);
|
||||||
|
|
||||||
let db: Vec<MusicInfo> = serde_json::from_reader(json)
|
let db: Vec<MusicInfo> = serde_json::from_reader(buf_reader)
|
||||||
.inspect_err(|e| warn!("failed to load musicDB: {e}"))
|
.inspect_err(|e| warn!("failed to load musicDB: {e}"))
|
||||||
.ok()?;
|
.ok()?;
|
||||||
|
|
||||||
|
info!(
|
||||||
|
"loaded musicDB, cost {}ms",
|
||||||
|
time.elapsed().unwrap_or_default().as_millis()
|
||||||
|
);
|
||||||
|
|
||||||
Some(db.into_iter().map(|entry| (entry.id, entry)).collect())
|
Some(db.into_iter().map(|entry| (entry.id, entry)).collect())
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::{
|
||||||
|
io::stdout,
|
||||||
|
sync::atomic::{AtomicBool, Ordering},
|
||||||
|
};
|
||||||
|
|
||||||
use nyquest_preset::nyquest::ClientBuilder;
|
use nyquest_preset::nyquest::ClientBuilder;
|
||||||
use palc::Parser;
|
use palc::Parser;
|
||||||
@@ -116,10 +119,17 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
|
|||||||
}
|
}
|
||||||
commands::Commands::QRLogin { ref qrcode_content } => {
|
commands::Commands::QRLogin { ref qrcode_content } => {
|
||||||
let qrcode = QRCode { qrcode_content };
|
let qrcode = QRCode { qrcode_content };
|
||||||
match qrcode.login(&client).await {
|
let resp = qrcode.login(&client).await;
|
||||||
|
|
||||||
|
match &resp {
|
||||||
Ok(user_id) => info!("login succeed: {user_id}"),
|
Ok(user_id) => info!("login succeed: {user_id}"),
|
||||||
Err(e) => error!("login failed: {e}"),
|
Err(e) => error!("login failed: {e}"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !human_readable {
|
||||||
|
let lock = stdout().lock();
|
||||||
|
serde_json::to_writer_pretty(lock, &resp)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
commands::Commands::AuthLite { title_ver, variant } => {
|
commands::Commands::AuthLite { title_ver, variant } => {
|
||||||
|
|||||||
Reference in New Issue
Block a user