// Copyright 2015 Matthew Collins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use nbt; use protocol::Serializable; use std::io; use std::io::{Read, Write}; use byteorder::{BigEndian, WriteBytesExt, ReadBytesExt}; #[derive(Debug)] pub struct Stack { id: isize, count: isize, damage: isize, tag: Option, } impl Default for Stack { fn default() -> Stack { Stack { id: -1, count: 0, damage: 0, tag: None, } } } impl Serializable for Option { fn read_from(buf: &mut io::Read) -> Result, io::Error> { let id = try!(buf.read_i16::()); if id == -1 { return Ok(None); } Ok(Some(Stack { id: id as isize, count: try!(buf.read_u8()) as isize, damage: try!(buf.read_i16::()) as isize, tag: try!(Serializable::read_from(buf)), })) } fn write_to(&self, buf: &mut io::Write) -> Result<(), io::Error> { match *self { Some(ref val) => { try!(buf.write_i16::(val.id as i16)); try!(buf.write_u8(val.count as u8)); try!(buf.write_i16::(val.damage as i16)); try!(val.tag.write_to(buf)); } None => try!(buf.write_i16::(-1)), } Result::Ok(()) } }