Convert to a public API for now

This commit is contained in:
Adam Gausmann 2021-10-23 22:55:20 -05:00
parent 0e8edad446
commit 8219f968f5

View file

@ -1,77 +1,76 @@
use std::io::{Read, Write}; use std::io::{Read, Write};
#[derive(Debug, Clone, Copy, PartialEq)] #[derive(Debug, Clone, Copy, PartialEq)]
#[non_exhaustive]
pub enum SaveType { pub enum SaveType {
World, World,
Subassembly, Subassembly,
} }
#[derive(Debug)] #[derive(Debug)]
struct ModInfo { pub struct ModInfo {
mod_id: String, pub mod_id: String,
mod_version: [i32; 4], pub mod_version: [i32; 4],
} }
#[derive(Debug)] #[derive(Debug)]
struct ComponentType { pub struct ComponentType {
numeric_id: u16, pub numeric_id: u16,
text_id: String, pub text_id: String,
} }
#[derive(Debug)] #[derive(Debug)]
struct Input { pub struct Input {
circuit_state_id: i32, pub circuit_state_id: i32,
} }
#[derive(Debug)] #[derive(Debug)]
struct Output { pub struct Output {
circuit_state_id: i32, pub circuit_state_id: i32,
} }
#[derive(Debug)] #[derive(Debug)]
struct Component { pub struct Component {
address: u32, pub address: u32,
parent: u32, pub parent: u32,
type_id: u16, pub type_id: u16,
position: [f32; 3], pub position: [f32; 3],
rotation: [f32; 4], pub rotation: [f32; 4],
inputs: Vec<Input>, pub inputs: Vec<Input>,
outputs: Vec<Output>, pub outputs: Vec<Output>,
custom_data: Option<Vec<u8>>, pub custom_data: Option<Vec<u8>>,
} }
#[derive(Debug)] #[derive(Debug)]
struct PegAddress { pub struct PegAddress {
is_input: bool, pub is_input: bool,
component_address: u32, pub component_address: u32,
peg_index: i32, pub peg_index: i32,
} }
#[derive(Debug)] #[derive(Debug)]
struct Wire { pub struct Wire {
start_peg: PegAddress, pub start_peg: PegAddress,
end_peg: PegAddress, pub end_peg: PegAddress,
circuit_state_id: i32, pub circuit_state_id: i32,
rotation: f32, pub rotation: f32,
} }
#[derive(Debug)] #[derive(Debug)]
enum CircuitStates { pub enum CircuitStates {
WorldFormat { circuit_states: Vec<u8> }, WorldFormat { circuit_states: Vec<u8> },
SubassemblyFormat { on_states: Vec<i32> }, SubassemblyFormat { on_states: Vec<i32> },
} }
#[derive(Debug)] #[derive(Debug)]
pub struct BlotterFile { pub struct BlotterFile {
save_version: u8, pub save_version: u8,
game_version: [i32; 4], pub game_version: [i32; 4],
save_type: SaveType, pub save_type: SaveType,
mods: Vec<ModInfo>, pub mods: Vec<ModInfo>,
component_types: Vec<ComponentType>, pub component_types: Vec<ComponentType>,
components: Vec<Component>, pub components: Vec<Component>,
wires: Vec<Wire>, pub wires: Vec<Wire>,
circuit_states: CircuitStates, pub circuit_states: CircuitStates,
} }
impl BlotterFile { impl BlotterFile {
@ -108,7 +107,7 @@ impl BlotterFile {
1 => SaveType::World, 1 => SaveType::World,
2 => SaveType::Subassembly, 2 => SaveType::Subassembly,
_ => { _ => {
return Err(Error::UnknownSaveType(save_type_id)); return Err(Error::InvalidSave);
} }
}; };
@ -280,17 +279,20 @@ impl BlotterFile {
write_f32(wire.rotation, writer)?; write_f32(wire.rotation, writer)?;
} }
match &self.circuit_states { match (self.save_type, &self.circuit_states) {
CircuitStates::WorldFormat { circuit_states } => { (SaveType::World, CircuitStates::WorldFormat { circuit_states }) => {
write_usize(circuit_states.len(), writer)?; write_usize(circuit_states.len(), writer)?;
writer.write_all(&circuit_states)?; writer.write_all(&circuit_states)?;
} }
CircuitStates::SubassemblyFormat { on_states } => { (SaveType::Subassembly, CircuitStates::SubassemblyFormat { on_states }) => {
write_usize(on_states.len(), writer)?; write_usize(on_states.len(), writer)?;
for &v in on_states { for &v in on_states {
write_i32(v, writer)?; write_i32(v, writer)?;
} }
} }
_ => {
return Err(Error::InvalidSave);
}
} }
writer.write_all(b"redstone sux lol")?; writer.write_all(b"redstone sux lol")?;
@ -304,7 +306,6 @@ pub enum Error {
IoError(std::io::Error), IoError(std::io::Error),
InvalidSave, InvalidSave,
IncompatibleVersion(u8), IncompatibleVersion(u8),
UnknownSaveType(u8),
} }
impl From<std::io::Error> for Error { impl From<std::io::Error> for Error {