1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
//! This crate provides a library for safe parsing, editing and saving of [Teeworlds](https://www.teeworlds.com/) and [DDNet](https://ddnet.tw/) maps.
//! Goals of this library are:
//!
//! - performance
//! - reasonable map standards
//! - compatibility with all Teeworlds [maps](https://github.com/teeworlds/teeworlds-maps) (0.7) and DDNet (0.6) [maps](https://github.com/ddnet/ddnet-maps)
//!
//! In the very center of this library is the [`TwMap`](struct.TwMap.html) struct.
//! For more information and the complete list of its available methods, check out its documentation page.
//!
//! Note that library is a aware of the origin of the map (Teeworlds 0.7 or DDNet 0.6).
//! On parsing a map it will store its [`Version`](enum.Version.html) in the `version` field, which in turn is used to perform the appropriate checks and save in the correct version.
//!
//!
//! # Examples:
//!
//! Note that for better readability, some lines of code are left out in the examples, most notably `use twmap::*;` at the top.
//!
//! Loading a binary map, accessing its version and image names and saving it again in the binary format:
//! ```
//! # use std::path::PathBuf;
//! # use twmap::*;
//! #
//! # let dm1_path = PathBuf::from("tests/dm1.map");
//! let mut map = TwMap::parse_file(dm1_path)?;
//!
//! assert_eq!(map.version, Version::Teeworlds07);
//! assert_eq!(map.images[0].name(), "bg_cloud1");
//! assert_eq!(map.images[6].name(), "sun");
//!
//! # let mut tmp_dir = tempfile::tempdir().unwrap();
//! # let output_path = tmp_dir.path().join("dm1_new").with_extension("map");
//! map.save_file(output_path)?;
//! # Ok::<(), Error>(())
//! ```
//!
//! Loading a MapDir **or** binary map, removing unused envelopes, layers, groups, images, sounds and saving it again in the MapDir format:
//! ```
//! # use std::path::PathBuf;
//! # use twmap::*;
//! #
//! # let dm1_path = PathBuf::from("tests/dm1.map");
//! # let mut dm1 = TwMap::parse_file(dm1_path)?;
//! # let tmp_dir = tempfile::tempdir().unwrap();
//! # let map_path = tmp_dir.path().join("map").with_extension("map");
//! # dm1.save_dir(&map_path);
//! let mut map = TwMap::parse_path(map_path)?;
//!
//! map.remove_everything_unused();
//!
//! # let tmp_dir = tempfile::tempdir().unwrap();
//! # let output_path = tmp_dir.path().join("map_new");
//! map.save_dir(output_path)?;
//! # Ok::<(), Error>(())
//! ```
//!
//! Loading a MapDir map, flipping it upside down and saving the map data into a vector:
//!
//! ```
//! # use std::path::PathBuf;
//! # use twmap::*;
//! #
//! # let dm1_path = PathBuf::from("tests/dm1.map");
//! # let mut dm1 = TwMap::parse_file(dm1_path)?;
//! # let tmp_dir = tempfile::tempdir().unwrap();
//! # let map_path = tmp_dir.path().join("map").with_extension("map");
//! # dm1.save_dir(&map_path);
//! let mut map = TwMap::parse_dir(map_path)?;
//! # // TODO: Fix this as soon as NoneError is stable
//! // Usually you would match the Option<TwMap> return values
//! // -> or wrap it into a function that also returns an Option
//! // To take up less space, we insert an error that we return in place of the None value
//! # let e = std::io::Error::from_raw_os_error(21);
//! map = map.rotate_right().ok_or(e)?;
//! # let e = std::io::Error::from_raw_os_error(21);
//! map = map.rotate_right().ok_or(e)?;
//! # let e = std::io::Error::from_raw_os_error(21);
//! map = map.mirror().ok_or(e)?;
//!
//! let mut map_data = Vec::new();
//! map.save(&mut map_data)?;
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```
pub mod datafile_parse; // parsing of datafiles (the native binary format of map files)
pub mod datafile_save; // saving of datafiles

mod map; // central structs and traits
pub use map::*;
mod map_load;    // decompression of compressed parts of the TwMap struct
pub use map_load::{Load, LoadMultiple};

pub mod map_impl;    // basic getter-like operations for the relevant map structs
pub mod map_parse;   // parsing of maps from datafiles
pub mod map_save;    // saving maps into datafiles

pub mod map_checks;  // checks for the integrity of TwMap structs
pub mod map_edit;    // advanced methods on maps
pub mod map_dir;     // saving maps in the directory map format

pub mod constants;

pub mod compression; // safe zlib (libz-sys) wrapper
pub mod convert;