Files
openstock/src/commands/score.rs
T
Hana b3feec08db
CI / test (push) Successful in 2m13s
Add stock scoring commands
2026-06-09 18:18:07 +09:00

161 lines
5.9 KiB
Rust

use clap::{Args, Subcommand};
#[derive(Subcommand)]
pub enum ScoreCommands {
/// 종목 평가 점수 저장 또는 갱신
Set(ScoreSetCommand),
/// 종목 평가 점수 조회
Get(ScoreSymbolCommand),
/// 저장된 종목 평가 점수 목록 조회
List,
/// 종목 평가 점수 삭제
Delete(ScoreSymbolCommand),
}
#[derive(Args)]
pub struct ScoreSetCommand {
/// 종목코드 또는 종목 ID
pub symbol: String,
/// 종목 평가 점수 (0~100)
pub score: u16,
}
#[derive(Args)]
pub struct ScoreSymbolCommand {
/// 종목코드 또는 종목 ID
pub symbol: String,
}
pub fn handle_score(sub: &ScoreCommands) {
match sub {
ScoreCommands::Set(command) => {
match crate::core::scores::set(&command.symbol, command.score) {
Ok(record) => print_record("score set", "종목 평가 점수 저장 결과", record),
Err(err) => eprintln!(
"{}",
crate::core::output::error("score set", "종목 평가 점수 저장 실패", &err)
),
}
}
ScoreCommands::Get(command) => match crate::core::scores::get(&command.symbol) {
Ok(Some(record)) => print_record("score get", "종목 평가 점수 조회 결과", record),
Ok(None) => eprintln!(
"{}",
crate::core::output::error(
"score get",
"종목 평가 점수 조회 실패",
"해당 종목의 저장된 점수가 없습니다.",
)
),
Err(err) => eprintln!(
"{}",
crate::core::output::error("score get", "종목 평가 점수 조회 실패", &err)
),
},
ScoreCommands::List => match crate::core::scores::list() {
Ok(scores) => println!(
"{}",
crate::core::output::explained_with_raw(
"score list",
"저장된 종목 평가 점수 목록",
vec![
crate::core::output::field(
"path",
"종목 평가 점수를 저장하는 파일 경로",
serde_json::json!(crate::core::scores::path()),
),
crate::core::output::field(
"count",
"저장된 종목 평가 점수 개수",
serde_json::json!(scores.len()),
),
crate::core::output::field(
"scores",
"점수 내림차순으로 정렬한 종목 평가 목록",
serde_json::json!(scores),
),
],
serde_json::Value::Null,
)
),
Err(err) => eprintln!(
"{}",
crate::core::output::error("score list", "종목 평가 점수 목록 조회 실패", &err)
),
},
ScoreCommands::Delete(command) => match crate::core::scores::delete(&command.symbol) {
Ok(removed) => println!(
"{}",
crate::core::output::explained_with_raw(
"score delete",
"종목 평가 점수 삭제 결과",
vec![
crate::core::output::field(
"path",
"종목 평가 점수를 저장하는 파일 경로",
serde_json::json!(crate::core::scores::path()),
),
crate::core::output::field(
"symbol",
"삭제 요청한 종목코드 또는 종목 ID",
serde_json::json!(command.symbol.trim().to_ascii_uppercase()),
),
crate::core::output::field(
"deleted",
"저장된 점수가 존재해서 삭제되었는지 여부",
serde_json::json!(removed.is_some()),
),
crate::core::output::field(
"removed",
"삭제된 기존 점수 기록",
serde_json::json!(removed),
),
],
serde_json::Value::Null,
)
),
Err(err) => eprintln!(
"{}",
crate::core::output::error("score delete", "종목 평가 점수 삭제 실패", &err)
),
},
}
}
fn print_record(command: &str, description: &str, record: crate::core::scores::StockScore) {
println!(
"{}",
crate::core::output::explained_with_raw(
command,
description,
vec![
crate::core::output::field(
"path",
"종목 평가 점수를 저장하는 파일 경로",
serde_json::json!(crate::core::scores::path()),
),
crate::core::output::field(
"symbol",
"점수를 매긴 종목코드 또는 종목 ID",
serde_json::json!(record.symbol),
),
crate::core::output::field(
"score",
"종목 평가 점수. 0은 최저, 100은 최고",
serde_json::json!(record.score),
),
crate::core::output::field(
"updated_at_unix",
"점수를 저장하거나 갱신한 Unix timestamp(초)",
serde_json::json!(record.updated_at_unix),
),
],
serde_json::Value::Null,
)
);
}