2021-02-09 03:14:55 +03:00

101 lines
2.1 KiB
Rust

use linked_hash_map::LinkedHashMap;
use serde::Deserialize;
#[derive(Debug, Deserialize)]
pub struct ProtocolHandler {
pub handshaking: Protocol,
pub status: Protocol,
pub login: Protocol,
#[serde(rename = "play")]
pub game: Protocol,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Protocol {
pub to_client: Packets,
pub to_server: Packets,
}
#[derive(Debug, Deserialize)]
pub struct Packets {
pub types: LinkedHashMap<String, Vec<Data>>,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum Data {
Type(String),
Container(Vec<Container>),
Mapper {
#[serde(rename = "type")]
mappings_type: String,
mappings: LinkedHashMap<String, String>,
},
Switch(Switch),
List(Box<List>),
Bitfield(Vec<BitField>),
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum Container {
Value {
name: String,
#[serde(rename = "type")]
data: Data,
},
List {
name: Option<String>,
#[serde(rename = "type")]
data_vec: Vec<Data>,
},
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum Switch {
Value {
#[serde(rename = "compareTo")]
compare_to: String,
fields: LinkedHashMap<String, Data>,
},
List {
#[serde(rename = "compareTo")]
compare_to: String,
fields: LinkedHashMap<String, Vec<Data>>,
},
Empty {
#[serde(rename = "compareTo")]
compare_to: String,
},
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum List {
Value {
#[serde(rename = "countType")]
count_type: String,
#[serde(rename = "type")]
list_type: Data,
},
List {
#[serde(rename = "countType")]
count_type: String,
#[serde(rename = "type")]
list_type: Vec<Data>,
},
Empty {
#[serde(rename = "countType")]
count_type: String,
},
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
pub struct BitField {
name: String,
size: usize,
signed: bool,
}