pub mod godot;
pub mod json;
pub mod libgdx;
pub mod unity;
pub use godot::*;
pub use json::*;
pub use libgdx::*;
pub use unity::*;
use std::path::Path;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum ExportError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Serialization error: {0}")]
Serialization(String),
#[error("Configuration error: {0}")]
Config(String),
}
impl From<serde_json::Error> for ExportError {
fn from(e: serde_json::Error) -> Self {
ExportError::Serialization(e.to_string())
}
}
#[derive(Debug, Clone)]
pub struct ExportOptions {
pub pretty: bool,
pub include_sources: bool,
}
impl Default for ExportOptions {
fn default() -> Self {
Self { pretty: true, include_sources: false }
}
}
pub trait Exporter {
fn export(
&self,
metadata: &crate::atlas::AtlasMetadata,
output_path: &Path,
options: &ExportOptions,
) -> Result<(), ExportError>;
fn format_name(&self) -> &'static str;
fn extension(&self) -> &'static str;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_export_options_default() {
let options = ExportOptions::default();
assert!(options.pretty);
assert!(!options.include_sources);
}
#[test]
fn test_export_error_display() {
let io_err =
ExportError::Io(std::io::Error::new(std::io::ErrorKind::NotFound, "file not found"));
assert!(io_err.to_string().contains("IO error"));
let ser_err = ExportError::Serialization("invalid json".to_string());
assert!(ser_err.to_string().contains("Serialization error"));
let cfg_err = ExportError::Config("missing field".to_string());
assert!(cfg_err.to_string().contains("Configuration error"));
}
}