Beatsaber Rust Utilities: A Beatsaber V3 parsing library.
beatsaber beatmap
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Started setting up auto-generated template.

+317 -2
+1 -1
Cargo.toml
··· 5 5 6 6 [dependencies] 7 7 serde = { version = "1.0.219", features = ["derive"] } 8 - serde_json = "1.0.140" 8 + serde_json = "1.0.140"
+60
src/difficulty.rs
··· 1 + pub mod lightshow; 2 + pub mod playfield; 3 + 4 + use crate::difficulty::lightshow::color::ColorEventBox; 5 + use crate::difficulty::lightshow::rotation::RotationEventBoxGroup; 6 + use crate::difficulty::playfield::{Arc, Bomb, Chain, Note, Wall}; 7 + use serde::{Deserialize, Serialize}; 8 + use serde_json::Value; 9 + 10 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 11 + #[serde(rename_all = "camelCase")] 12 + pub struct DifficultyV3_2 { 13 + pub version: String, 14 + pub bpm_events: Vec<BpmEvent>, 15 + pub rotation_events: Vec<Value>, 16 + #[serde(rename = "colorNotes")] 17 + pub notes: Vec<Note>, 18 + #[serde(rename = "bombNotes")] 19 + pub bombs: Vec<Bomb>, 20 + #[serde(rename = "obstacles")] 21 + pub walls: Vec<Wall>, 22 + #[serde(rename = "sliders")] 23 + pub arcs: Vec<Arc>, 24 + #[serde(rename = "burstSliders")] 25 + pub chains: Vec<Chain>, 26 + pub waypoints: Vec<Value>, 27 + pub basic_beatmap_events: Vec<Value>, 28 + pub color_boost_beatmap_events: Vec<ColorBoostEvent>, 29 + #[serde(rename = "lightColorEventBoxGroups")] 30 + pub color_event_boxes: Vec<ColorEventBox>, 31 + #[serde(rename = "lightRotationEventBoxGroups")] 32 + pub rotation_event_boxes: Vec<RotationEventBoxGroup>, 33 + #[serde(rename = "lightTranslationEventBoxGroups")] 34 + pub translation_event_boxes: Vec<Value>, 35 + pub basic_event_types_with_keywords: BasicEventTypesWithKeywords, 36 + pub use_normal_events_as_compatible_events: bool, 37 + } 38 + 39 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 40 + #[serde(rename_all = "camelCase")] 41 + pub struct BpmEvent { 42 + #[serde(rename = "b")] 43 + pub beat: f32, 44 + #[serde(rename = "m")] 45 + pub bpm: i32, 46 + } 47 + 48 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 49 + #[serde(rename_all = "camelCase")] 50 + pub struct ColorBoostEvent { 51 + #[serde(rename = "b")] 52 + pub beat: f32, 53 + pub o: bool, 54 + } 55 + 56 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 57 + #[serde(rename_all = "camelCase")] 58 + pub struct BasicEventTypesWithKeywords { 59 + pub d: Vec<Value>, 60 + }
+19
src/difficulty/lightshow.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + 3 + pub mod color; 4 + pub mod rotation; 5 + 6 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 7 + #[serde(rename_all = "camelCase")] 8 + pub struct Filter { 9 + pub f: i32, 10 + pub p: i32, 11 + pub t: i32, 12 + pub r: i32, 13 + #[serde(rename = "c")] 14 + pub color: i32, 15 + pub n: i32, 16 + pub s: i32, 17 + pub l: i32, 18 + pub d: i32, 19 + }
+41
src/difficulty/lightshow/color.rs
··· 1 + use crate::difficulty::lightshow::Filter; 2 + use serde::{Deserialize, Serialize}; 3 + 4 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 5 + #[serde(rename_all = "camelCase")] 6 + pub struct ColorEventBox { 7 + #[serde(rename = "b")] 8 + pub beat: f32, 9 + #[serde(rename = "g")] 10 + pub group_id: i32, 11 + #[serde(rename = "e")] 12 + pub groups: Vec<ColorEventGroup>, 13 + } 14 + 15 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 16 + #[serde(rename_all = "camelCase")] 17 + pub struct ColorEventGroup { 18 + #[serde(rename = "f")] 19 + pub filter: Filter, 20 + pub w: f32, 21 + pub d: i32, 22 + pub r: f32, 23 + pub t: i32, 24 + #[serde(rename = "b")] 25 + pub beat: i32, 26 + pub i: i32, 27 + #[serde(rename = "e")] 28 + pub data: Vec<ColorEventData>, 29 + } 30 + 31 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 32 + #[serde(rename_all = "camelCase")] 33 + pub struct ColorEventData { 34 + #[serde(rename = "b")] 35 + pub beat: f32, 36 + pub i: i32, 37 + #[serde(rename = "c")] 38 + pub color: i32, 39 + pub s: f32, 40 + pub f: i32, 41 + }
+42
src/difficulty/lightshow/rotation.rs
··· 1 + use crate::difficulty::lightshow::Filter; 2 + use serde::{Deserialize, Serialize}; 3 + 4 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 5 + #[serde(rename_all = "camelCase")] 6 + pub struct RotationEventBoxGroup { 7 + #[serde(rename = "b")] 8 + pub beat: f32, 9 + #[serde(rename = "g")] 10 + pub group_id: i32, 11 + #[serde(rename = "e")] 12 + pub groups: Vec<RotationEventGroup>, 13 + } 14 + 15 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 16 + #[serde(rename_all = "camelCase")] 17 + pub struct RotationEventGroup { 18 + pub f: Filter, 19 + pub w: f32, 20 + pub d: i32, 21 + pub s: i32, 22 + pub t: i32, 23 + #[serde(rename = "b")] 24 + pub beat: i32, 25 + pub a: i32, 26 + pub r: i32, 27 + pub i: i32, 28 + #[serde(rename = "l")] 29 + pub data: Vec<RotationEventData>, 30 + } 31 + 32 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 33 + #[serde(rename_all = "camelCase")] 34 + pub struct RotationEventData { 35 + #[serde(rename = "b")] 36 + pub beat: f32, 37 + pub p: i32, 38 + pub e: i32, 39 + pub l: i32, 40 + pub r: i32, 41 + pub o: i32, 42 + }
+86
src/difficulty/playfield.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + 3 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 4 + #[serde(rename_all = "camelCase")] 5 + pub struct Note { 6 + #[serde(rename = "b")] 7 + pub beat: f32, 8 + #[serde(rename = "x")] 9 + pub row: i32, 10 + #[serde(rename = "y")] 11 + pub col: i32, 12 + #[serde(rename = "c")] 13 + pub color: i32, 14 + #[serde(rename = "d")] 15 + pub direction: i32, 16 + #[serde(rename = "a")] 17 + pub angle_offset: i32, 18 + } 19 + 20 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 21 + #[serde(rename_all = "camelCase")] 22 + pub struct Bomb { 23 + #[serde(rename = "b")] 24 + pub beat: f32, 25 + #[serde(rename = "x")] 26 + pub row: i32, 27 + #[serde(rename = "y")] 28 + pub col: i32, 29 + } 30 + 31 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 32 + #[serde(rename_all = "camelCase")] 33 + pub struct Wall { 34 + #[serde(rename = "b")] 35 + pub beat: f32, 36 + #[serde(rename = "d")] 37 + pub duration: f32, 38 + #[serde(rename = "x")] 39 + pub row: i32, 40 + #[serde(rename = "y")] 41 + pub col: i32, 42 + #[serde(rename = "w")] 43 + pub width: i32, 44 + #[serde(rename = "h")] 45 + pub height: i32, 46 + } 47 + 48 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 49 + #[serde(rename_all = "camelCase")] 50 + pub struct Arc { 51 + #[serde(rename = "b")] 52 + pub beat: f32, 53 + #[serde(rename = "c")] 54 + pub color: i32, 55 + #[serde(rename = "x")] 56 + pub row: i32, 57 + #[serde(rename = "y")] 58 + pub col: i32, 59 + pub d: i32, 60 + pub tb: f32, 61 + pub tx: i32, 62 + pub ty: i32, 63 + pub mu: i32, 64 + pub tmu: i32, 65 + pub tc: i32, 66 + pub m: i32, 67 + } 68 + 69 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 70 + #[serde(rename_all = "camelCase")] 71 + pub struct Chain { 72 + #[serde(rename = "b")] 73 + pub beat: f32, 74 + #[serde(rename = "c")] 75 + pub color: i32, 76 + #[serde(rename = "x")] 77 + pub row: i32, 78 + #[serde(rename = "y")] 79 + pub col: i32, 80 + pub d: i32, 81 + pub tb: f32, 82 + pub tx: i32, 83 + pub ty: i32, 84 + pub sc: i32, 85 + pub s: i32, 86 + }
+64
src/info.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + use serde_json::Value; 3 + 4 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 5 + pub struct InfoV2 { 6 + #[serde(rename = "_version")] 7 + pub version: String, 8 + #[serde(rename = "_songName")] 9 + pub song_name: String, 10 + #[serde(rename = "_songSubName")] 11 + pub song_sub_name: String, 12 + #[serde(rename = "_songAuthorName")] 13 + pub song_author_name: String, 14 + #[serde(rename = "_levelAuthorName")] 15 + pub level_author_name: String, 16 + #[serde(rename = "_beatsPerMinute")] 17 + pub beats_per_minute: i32, 18 + #[serde(rename = "_songTimeOffset")] 19 + pub song_time_offset: i32, 20 + #[serde(rename = "_shuffle")] 21 + pub shuffle: i32, 22 + #[serde(rename = "_shufflePeriod")] 23 + pub shuffle_period: i32, 24 + #[serde(rename = "_previewStartTime")] 25 + pub preview_start_time: f32, 26 + #[serde(rename = "_previewDuration")] 27 + pub preview_duration: i32, 28 + #[serde(rename = "_songFilename")] 29 + pub song_filename: String, 30 + #[serde(rename = "_coverImageFilename")] 31 + pub cover_image_filename: String, 32 + #[serde(rename = "_environmentName")] 33 + pub environment_name: String, 34 + #[serde(rename = "_allDirectionsEnvironmentName")] 35 + pub all_directions_environment_name: String, 36 + #[serde(rename = "_environmentNames")] 37 + pub environment_names: Vec<Value>, 38 + #[serde(rename = "_colorSchemes")] 39 + pub color_schemes: Vec<Value>, 40 + #[serde(rename = "_difficultyBeatmapSets")] 41 + pub difficulty_beatmap_sets: Vec<DifficultyBeatmapSet>, 42 + } 43 + 44 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 45 + pub struct DifficultyBeatmapSet { 46 + #[serde(rename = "_beatmapCharacteristicName")] 47 + pub beatmap_characteristic_name: String, 48 + #[serde(rename = "_difficultyBeatmaps")] 49 + pub difficulty_beatmaps: Vec<DifficultyBeatmap>, 50 + } 51 + 52 + #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 53 + pub struct DifficultyBeatmap { 54 + #[serde(rename = "_difficulty")] 55 + pub difficulty: String, 56 + #[serde(rename = "_difficultyRank")] 57 + pub difficulty_rank: i32, 58 + #[serde(rename = "_beatmapFilename")] 59 + pub beatmap_filename: String, 60 + #[serde(rename = "_noteJumpMovementSpeed")] 61 + pub note_jump_movement_speed: i32, 62 + #[serde(rename = "_noteJumpStartBeatOffset")] 63 + pub note_jump_start_beat_offset: f32, 64 + }
+4 -1
src/lib.rs
··· 1 + pub mod difficulty; 2 + pub mod info; 3 + 1 4 pub fn add(left: u64, right: u64) -> u64 { 2 5 left + right 3 6 } 4 7 5 8 #[cfg(test)] 6 - mod tests { 9 + pub mod tests { 7 10 use super::*; 8 11 9 12 #[test]