use serde::{Deserialize, Serialize};
impl std::str::FromStr for Bmson {
type Err = serde_json::Error;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
serde_json::from_str(s)
}
}
impl Bmson {
pub fn parse(source: &str) -> serde_json::Result<Bmson> {
serde_json::from_str(source)
}
pub fn to_string(&self) -> serde_json::Result<String> {
serde_json::to_string(self)
}
pub fn to_string_pretty(&self) -> serde_json::Result<String> {
serde_json::to_string_pretty(self)
}
}
#[derive(Deserialize, Serialize, Clone, Default, Debug, PartialEq)]
pub struct Bmson {
pub version: String,
pub info: BmsonInfo,
pub lines: Option<Vec<BarLine>>,
pub bpm_events: Option<Vec<BpmEvent>>,
pub stop_events: Option<Vec<StopEvent>>,
pub sound_channels: Option<Vec<SoundChannel>>,
pub bga: Bga,
#[serde(skip_serializing_if = "Option::is_none")]
pub scroll_events: Option<Vec<ScrollEvent>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mine_channels: Option<Vec<MineChannel>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key_channels: Option<Vec<KeyChannel>>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct BmsonInfo {
pub title: String,
#[serde(default)]
pub subtitle: String,
pub artist: String,
pub subartists: Option<Vec<String>>,
pub genre: String,
#[serde(default = "default_mode_hint")]
pub mode_hint: String,
pub chart_name: String,
pub level: u32,
pub init_bpm: f64,
#[serde(default = "default_judge_rank")]
pub judge_rank: f64,
#[serde(default = "default_total")]
pub total: f64,
pub back_image: Option<String>,
pub eyecatch_image: Option<String>,
pub title_image: Option<String>,
pub banner_image: Option<String>,
pub preview_music: Option<String>,
#[serde(default = "default_resolution")]
pub resolution: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub ln_type: Option<LongNoteType>,
}
fn default_mode_hint() -> String {
"beat-7k".to_string()
}
fn default_judge_rank() -> f64 {
100.
}
fn default_total() -> f64 {
100.
}
fn default_resolution() -> u32 {
240
}
impl Default for BmsonInfo {
fn default() -> Self {
BmsonInfo {
title: String::new(),
subtitle: String::new(),
artist: String::new(),
subartists: None,
genre: String::new(),
mode_hint: "beat-7k".to_string(),
chart_name: String::new(),
level: 0,
init_bpm: 180.,
judge_rank: 100.,
total: 100.,
back_image: None,
eyecatch_image: None,
title_image: None,
banner_image: None,
preview_music: None,
resolution: 240,
ln_type: None,
}
}
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct BarLine {
pub y: u32,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct SoundChannel {
pub name: String,
pub notes: Vec<Note>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct Note {
pub x: Option<u32>,
pub y: u32,
pub l: u32,
pub c: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub t: Option<LongNoteType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub up: Option<bool>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct BpmEvent {
pub y: u32,
pub bpm: f64,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct StopEvent {
pub y: u32,
pub duration: u32,
}
#[derive(Deserialize, Serialize, Clone, Default, Debug, PartialEq)]
pub struct Bga {
pub bga_header: Vec<BgaHeader>,
pub bga_events: Vec<BgaEvent>,
pub layer_events: Vec<BgaEvent>,
pub poor_events: Vec<BgaEvent>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct BgaHeader {
pub id: u32,
pub name: String,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct BgaEvent {
pub y: u32,
pub id: u32,
}
#[derive(
serde_repr::Deserialize_repr,
serde_repr::Serialize_repr,
Clone,
Debug,
PartialEq,
)]
#[repr(u8)]
pub enum LongNoteType {
None = 0,
LongNote = 1,
ChargeNote = 2,
HellChargeNote = 3,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct ScrollEvent {
pub y: f64,
pub rate: f64,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct MineChannel {
pub name: String,
pub notes: Vec<MineNote>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct MineNote {
pub x: Option<u32>,
pub y: u32,
pub damage: f64,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct KeyChannel {
pub name: String,
pub notes: Vec<KeyNote>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct KeyNote {
pub x: Option<u32>,
pub y: u32,
}