namigator 0.1.0

Rust bindings for the namigator pathfinding library for World of Warcraft.
Documentation
use std::ffi::NulError;
use std::fmt::{Display, Formatter};

#[derive(Debug)]
pub enum NamigatorError {
    CStringConversion(NulError),
    PathCStringConversion,
    UnrecognizedExtension,
    NoMogpChunk,
    NoMopyChunk,
    NoMoviChunk,
    NoMovtChunk,
    NoMcnkChunk,
    WdtOpenFailed,
    MphdNotFound,
    MainNotFound,
    MdnmNotFound,
    MonmNotFound,
    MwmoNotFound,
    ModfNotFound,
    MverNotFound,
    MomoNotFound,
    MohdNotFound,
    ModsNotFound,
    ModnNotFound,
    ModdNotFound,
    MhdrNotFound,
    UnrecognizedDbcFile,
    FailedToOpenDbc,
    FailedToOpenAdt,
    AdtVersionIsIncorrect,
    MverDoesNotBeginAdtFile,
    EmptyWmoDoodadInstantiated,
    FailedToOpenFileForBinaryStream,
    BadFormatOfGameobjectFile,
    FailedToOpenGameobjectFile,
    UnrecognizedModelExtension,
    GameObjectReferencesNonExistentModelId,
    AdtSerializationFailedToOpenOutputFile,
    WmoSerializationFailedToOpenOutputFile,
    RequestedBvhNotFound,
    BvhIndexFileNotFound,
    IncorrectFileSignature,
    IncorrectFileVersion,
    NotWmoNavFile,
    NotWmoTileCoordinates,
    NotAdtNavFile,
    InvalidMapFile,
    IncorrectWmoCoordinates,
    DtNavMeshQueryInitFailed,
    UnknownWmoInstanceRequested,
    UnknownDoodadInstanceRequested,
    CouldNotDeserializeDoodad,
    CouldNotDeserializeWmo,
    IncorrectAdtCoordinates,
    TileNotFoundForRequested,
    CouldNotFindWmo,
    DoodadPathNotFound,
    UnsupportedDooadFormat,
    MapIdNotFound,
    WmoNotFound,
    BinaryStreamCompressFailed,
    MzInflateinitFailed,
    MzInflateFailed,
    InvalidRowColumnFromDbc,
    GameobjectWithSpecifiedGuidAlreadyExists,
    TemporaryWmoObstaclesAreNotSupported,
    NoDoodadSetSpecifiedForWmoGameObject,
    BadMatrixRow,
    InvalidMatrixMultiplication,
    Only4x4MatrixIsSupported,
    MatrixNotInvertible,
    UnexpectedVersionMagicInAlphaModel,
    UnexpectedVersionSizeInAlphaModel,
    UnsupportedAlphaModelVersion,
    UnexpectedVertexMagicInAlphaModel,
    UnexpectedTriangleMagicInAlphaModel,
    InvalidDoodadFile,
    CouldNotOpenMpq,
    GetRootAreaIdInvalidId,
    NoDataFilesFound,
    MpqManagerNotIniatialized,
    ErrorInSFileOpenFileEx,
    ErrorInSFileReadFile,
    MultipleCandidatesInAlphaMpq,
    TooManyFilesInAlphaMpq,
    NoMpqCandidate,
    RecastFailure,
    BufferTooSmall,
    UnknownPath,
    UnknownHeight,
    UnknownZoneAndArea,
    FailedToLoadAdt,
    MapDoesNotHaveAdt,
    FailedToFindPointBetweenVectors,

    UnknownException,

    MapIsNullPointer,
}

pub(crate) fn error_code_to_error(v: u8) -> NamigatorError {
    match v {
        namigator_sys::UNRECOGNIZED_EXTENSION => NamigatorError::UnrecognizedExtension,
        namigator_sys::NO_MOGP_CHUNK => NamigatorError::NoMogpChunk,
        namigator_sys::NO_MOPY_CHUNK => NamigatorError::NoMopyChunk,
        namigator_sys::NO_MOVI_CHUNK => NamigatorError::NoMoviChunk,
        namigator_sys::NO_MOVT_CHUNK => NamigatorError::NoMovtChunk,
        namigator_sys::NO_MCNK_CHUNK => NamigatorError::NoMcnkChunk,
        namigator_sys::WDT_OPEN_FAILED => NamigatorError::WdtOpenFailed,
        namigator_sys::MPHD_NOT_FOUND => NamigatorError::MphdNotFound,
        namigator_sys::MAIN_NOT_FOUND => NamigatorError::MainNotFound,
        namigator_sys::MDNM_NOT_FOUND => NamigatorError::MdnmNotFound,
        namigator_sys::MONM_NOT_FOUND => NamigatorError::MonmNotFound,
        namigator_sys::MWMO_NOT_FOUND => NamigatorError::MwmoNotFound,
        namigator_sys::MODF_NOT_FOUND => NamigatorError::ModfNotFound,
        namigator_sys::MVER_NOT_FOUND => NamigatorError::MverNotFound,
        namigator_sys::MOMO_NOT_FOUND => NamigatorError::MomoNotFound,
        namigator_sys::MOHD_NOT_FOUND => NamigatorError::MohdNotFound,
        namigator_sys::MODS_NOT_FOUND => NamigatorError::ModsNotFound,
        namigator_sys::MODN_NOT_FOUND => NamigatorError::ModnNotFound,
        namigator_sys::MODD_NOT_FOUND => NamigatorError::ModdNotFound,
        namigator_sys::MHDR_NOT_FOUND => NamigatorError::MhdrNotFound,
        namigator_sys::UNRECOGNIZED_DBC_FILE => NamigatorError::UnrecognizedDbcFile,
        namigator_sys::FAILED_TO_OPEN_DBC => NamigatorError::FailedToOpenDbc,
        namigator_sys::FAILED_TO_OPEN_ADT => NamigatorError::FailedToOpenAdt,
        namigator_sys::ADT_VERSION_IS_INCORRECT => NamigatorError::AdtVersionIsIncorrect,
        namigator_sys::MVER_DOES_NOT_BEGIN_ADT_FILE => NamigatorError::MverDoesNotBeginAdtFile,
        namigator_sys::EMPTY_WMO_DOODAD_INSTANTIATED => NamigatorError::EmptyWmoDoodadInstantiated,
        namigator_sys::FAILED_TO_OPEN_FILE_FOR_BINARY_STREAM => {
            NamigatorError::FailedToOpenFileForBinaryStream
        }
        namigator_sys::BAD_FORMAT_OF_GAMEOBJECT_FILE => NamigatorError::BadFormatOfGameobjectFile,
        namigator_sys::FAILED_TO_OPEN_GAMEOBJECT_FILE => NamigatorError::FailedToOpenGameobjectFile,
        namigator_sys::UNRECOGNIZED_MODEL_EXTENSION => NamigatorError::UnrecognizedModelExtension,
        namigator_sys::GAME_OBJECT_REFERENCES_NON_EXISTENT_MODEL_ID => {
            NamigatorError::GameObjectReferencesNonExistentModelId
        }
        namigator_sys::ADT_SERIALIZATION_FAILED_TO_OPEN_OUTPUT_FILE => {
            NamigatorError::AdtSerializationFailedToOpenOutputFile
        }
        namigator_sys::WMO_SERIALIZATION_FAILED_TO_OPEN_OUTPUT_FILE => {
            NamigatorError::WmoSerializationFailedToOpenOutputFile
        }
        namigator_sys::REQUESTED_BVH_NOT_FOUND => NamigatorError::RequestedBvhNotFound,
        namigator_sys::BVH_INDEX_FILE_NOT_FOUND => NamigatorError::BvhIndexFileNotFound,
        namigator_sys::INCORRECT_FILE_SIGNATURE => NamigatorError::IncorrectFileSignature,
        namigator_sys::INCORRECT_FILE_VERSION => NamigatorError::IncorrectFileVersion,
        namigator_sys::NOT_WMO_NAV_FILE => NamigatorError::NotWmoNavFile,
        namigator_sys::NOT_WMO_TILE_COORDINATES => NamigatorError::NotWmoTileCoordinates,
        namigator_sys::NOT_ADT_NAV_FILE => NamigatorError::NotAdtNavFile,
        namigator_sys::INVALID_MAP_FILE => NamigatorError::InvalidMapFile,
        namigator_sys::INCORRECT_WMO_COORDINATES => NamigatorError::IncorrectWmoCoordinates,
        namigator_sys::DTNAVMESHQUERY_INIT_FAILED => NamigatorError::DtNavMeshQueryInitFailed,
        namigator_sys::UNKNOWN_WMO_INSTANCE_REQUESTED => {
            NamigatorError::UnknownWmoInstanceRequested
        }
        namigator_sys::UNKNOWN_DOODAD_INSTANCE_REQUESTED => {
            NamigatorError::UnknownDoodadInstanceRequested
        }
        namigator_sys::COULD_NOT_DESERIALIZE_DOODAD => NamigatorError::CouldNotDeserializeDoodad,
        namigator_sys::COULD_NOT_DESERIALIZE_WMO => NamigatorError::CouldNotDeserializeWmo,
        namigator_sys::INCORRECT_ADT_COORDINATES => NamigatorError::IncorrectAdtCoordinates,
        namigator_sys::TILE_NOT_FOUND_FOR_REQUESTED => NamigatorError::TileNotFoundForRequested,
        namigator_sys::COULD_NOT_FIND_WMO => NamigatorError::CouldNotFindWmo,
        namigator_sys::DOODAD_PATH_NOT_FOUND => NamigatorError::DoodadPathNotFound,
        namigator_sys::UNSUPPORTED_DOOAD_FORMAT => NamigatorError::UnsupportedDooadFormat,
        namigator_sys::MAP_ID_NOT_FOUND => NamigatorError::MapIdNotFound,
        namigator_sys::WMO_NOT_FOUND => NamigatorError::WmoNotFound,
        namigator_sys::BINARYSTREAM_COMPRESS_FAILED => NamigatorError::BinaryStreamCompressFailed,
        namigator_sys::MZ_INFLATEINIT_FAILED => NamigatorError::MzInflateinitFailed,
        namigator_sys::MZ_INFLATE_FAILED => NamigatorError::MzInflateFailed,
        namigator_sys::INVALID_ROW_COLUMN_FROM_DBC => NamigatorError::InvalidRowColumnFromDbc,
        namigator_sys::GAMEOBJECT_WITH_SPECIFIED_GUID_ALREADY_EXISTS => {
            NamigatorError::GameobjectWithSpecifiedGuidAlreadyExists
        }
        namigator_sys::TEMPORARY_WMO_OBSTACLES_ARE_NOT_SUPPORTED => {
            NamigatorError::TemporaryWmoObstaclesAreNotSupported
        }
        namigator_sys::NO_DOODAD_SET_SPECIFIED_FOR_WMO_GAME_OBJECT => {
            NamigatorError::NoDoodadSetSpecifiedForWmoGameObject
        }
        namigator_sys::BAD_MATRIX_ROW => NamigatorError::BadMatrixRow,
        namigator_sys::INVALID_MATRIX_MULTIPLICATION => NamigatorError::InvalidMatrixMultiplication,
        namigator_sys::ONLY_4X4_MATRIX_IS_SUPPORTED => NamigatorError::Only4x4MatrixIsSupported,
        namigator_sys::MATRIX_NOT_INVERTIBLE => NamigatorError::MatrixNotInvertible,
        namigator_sys::UNEXPECTED_VERSION_MAGIC_IN_ALPHA_MODEL => {
            NamigatorError::UnexpectedVersionMagicInAlphaModel
        }
        namigator_sys::UNEXPECTED_VERSION_SIZE_IN_ALPHA_MODEL => {
            NamigatorError::UnexpectedVersionSizeInAlphaModel
        }
        namigator_sys::UNSUPPORTED_ALPHA_MODEL_VERSION => {
            NamigatorError::UnsupportedAlphaModelVersion
        }
        namigator_sys::UNEXPECTED_VERTEX_MAGIC_IN_ALPHA_MODEL => {
            NamigatorError::UnexpectedVertexMagicInAlphaModel
        }
        namigator_sys::UNEXPECTED_TRIANGLE_MAGIC_IN_ALPHA_MODEL => {
            NamigatorError::UnexpectedTriangleMagicInAlphaModel
        }
        namigator_sys::INVALID_DOODAD_FILE => NamigatorError::InvalidDoodadFile,
        namigator_sys::COULD_NOT_OPEN_MPQ => NamigatorError::CouldNotOpenMpq,
        namigator_sys::GETROOTAREAID_INVALID_ID => NamigatorError::GetRootAreaIdInvalidId,
        namigator_sys::NO_DATA_FILES_FOUND => NamigatorError::NoDataFilesFound,
        namigator_sys::MPQ_MANAGER_NOT_INIATIALIZED => NamigatorError::MpqManagerNotIniatialized,
        namigator_sys::ERROR_IN_SFILEOPENFILEX => NamigatorError::ErrorInSFileOpenFileEx,
        namigator_sys::ERROR_IN_SFILEREADFILE => NamigatorError::ErrorInSFileReadFile,
        namigator_sys::MULTIPLE_CANDIDATES_IN_ALPHA_MPQ => {
            NamigatorError::MultipleCandidatesInAlphaMpq
        }
        namigator_sys::TOO_MANY_FILES_IN_ALPHA_MPQ => NamigatorError::TooManyFilesInAlphaMpq,
        namigator_sys::NO_MPQ_CANDIDATE => NamigatorError::NoMpqCandidate,
        namigator_sys::RECAST_FAILURE => NamigatorError::RecastFailure,
        namigator_sys::BUFFER_TOO_SMALL => NamigatorError::BufferTooSmall,
        namigator_sys::UNKNOWN_PATH => NamigatorError::UnknownPath,
        namigator_sys::UNKNOWN_HEIGHT => NamigatorError::UnknownHeight,
        namigator_sys::UNKNOWN_ZONE_AND_AREA => NamigatorError::UnknownZoneAndArea,
        namigator_sys::FAILED_TO_LOAD_ADT => NamigatorError::FailedToLoadAdt,
        namigator_sys::MAP_DOES_NOT_HAVE_ADT => NamigatorError::MapDoesNotHaveAdt,
        namigator_sys::UNKNOWN_EXCEPTION => NamigatorError::UnknownException,
        namigator_sys::FAILED_TO_FIND_POINT_BETWEEN_VECTORS => {
            NamigatorError::FailedToFindPointBetweenVectors
        }
        _ => NamigatorError::UnknownException,
    }
}

impl Display for NamigatorError {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        match self {
            NamigatorError::CStringConversion(e) => e.fmt(f),
            NamigatorError::PathCStringConversion => {
                f.write_str("Error in converting the path to c string")
            }
            NamigatorError::UnknownException => f.write_str("Unknown Exception"),
            NamigatorError::UnrecognizedExtension => f.write_str("Unrecognized extension"),
            NamigatorError::NoMogpChunk => f.write_str("No MOGP chunk"),
            NamigatorError::NoMopyChunk => f.write_str("No MOPY chunk"),
            NamigatorError::NoMoviChunk => f.write_str("No MOVI chunk"),
            NamigatorError::NoMovtChunk => f.write_str("No MOVT chunk"),
            NamigatorError::NoMcnkChunk => f.write_str("No MCNK chunk"),
            NamigatorError::WdtOpenFailed => f.write_str("WDT open failed"),
            NamigatorError::MphdNotFound => f.write_str("MPHD not found"),
            NamigatorError::MainNotFound => f.write_str("MAIN not found"),
            NamigatorError::MdnmNotFound => f.write_str("MDNM not found"),
            NamigatorError::MonmNotFound => f.write_str("MONM not found"),
            NamigatorError::MwmoNotFound => f.write_str("MWMO not found"),
            NamigatorError::ModfNotFound => f.write_str("MODF not found"),
            NamigatorError::MverNotFound => f.write_str("MVER not found"),
            NamigatorError::MomoNotFound => f.write_str("MOMO not found"),
            NamigatorError::MohdNotFound => f.write_str("MOHD not found"),
            NamigatorError::ModsNotFound => f.write_str("MODS not found"),
            NamigatorError::ModnNotFound => f.write_str("MODN not found"),
            NamigatorError::ModdNotFound => f.write_str("MODD not found"),
            NamigatorError::MhdrNotFound => f.write_str("MHDR not found"),
            NamigatorError::UnrecognizedDbcFile => f.write_str("Unrecognized DBC file"),
            NamigatorError::FailedToOpenDbc => f.write_str("Failed to open DBC"),
            NamigatorError::FailedToOpenAdt => f.write_str("Failed to open ADT"),
            NamigatorError::AdtVersionIsIncorrect => f.write_str("ADT version is incorrect"),
            NamigatorError::MverDoesNotBeginAdtFile => f.write_str("MVER does not begin ADT file"),
            NamigatorError::EmptyWmoDoodadInstantiated => {
                f.write_str("Empty WMO doodads instantiated")
            }
            NamigatorError::FailedToOpenFileForBinaryStream => {
                f.write_str("Failed to open file for BinaryStream")
            }
            NamigatorError::BadFormatOfGameobjectFile => {
                f.write_str("Bad format of gameobject file")
            }
            NamigatorError::FailedToOpenGameobjectFile => {
                f.write_str("Failed to open gameobject file")
            }
            NamigatorError::UnrecognizedModelExtension => {
                f.write_str("Unrecognized model extension")
            }
            NamigatorError::GameObjectReferencesNonExistentModelId => {
                f.write_str("Gameobject references non-existent model id")
            }
            NamigatorError::AdtSerializationFailedToOpenOutputFile => {
                f.write_str("ADT serialization failed to open output file")
            }
            NamigatorError::WmoSerializationFailedToOpenOutputFile => {
                f.write_str("WMO serialization failed to open output file")
            }
            NamigatorError::RequestedBvhNotFound => f.write_str("Requested BVH not found"),
            NamigatorError::BvhIndexFileNotFound => f.write_str("BVH index file not found"),
            NamigatorError::IncorrectFileSignature => f.write_str("Incorrect file signature"),
            NamigatorError::IncorrectFileVersion => f.write_str("Incorrect file version"),
            NamigatorError::NotWmoNavFile => f.write_str("Not WMO nav file"),
            NamigatorError::NotWmoTileCoordinates => f.write_str("Not WMO tile coordinates"),
            NamigatorError::NotAdtNavFile => f.write_str("Not ADT nav file"),
            NamigatorError::InvalidMapFile => f.write_str("Invalid map file"),
            NamigatorError::IncorrectWmoCoordinates => f.write_str("Incorrect WMO coordinates"),
            NamigatorError::DtNavMeshQueryInitFailed => f.write_str("dtNavMeshQuery::init failed"),
            NamigatorError::UnknownWmoInstanceRequested => {
                f.write_str("Unknown WMO instance requested")
            }
            NamigatorError::UnknownDoodadInstanceRequested => {
                f.write_str("Unknown doodad instance requested")
            }
            NamigatorError::CouldNotDeserializeDoodad => {
                f.write_str("Could not deserialize doodad")
            }
            NamigatorError::CouldNotDeserializeWmo => f.write_str("Could not deserialize WMO"),
            NamigatorError::IncorrectAdtCoordinates => f.write_str("Incorrect ADT coordinates"),
            NamigatorError::TileNotFoundForRequested => f.write_str("Tile not found for requested"),
            NamigatorError::CouldNotFindWmo => f.write_str("Could not find WMO"),
            NamigatorError::DoodadPathNotFound => f.write_str("Dooad path not found"),
            NamigatorError::UnsupportedDooadFormat => f.write_str("Unsupported doodad format"),
            NamigatorError::MapIdNotFound => f.write_str("Map id not found"),
            NamigatorError::WmoNotFound => f.write_str("WMO not found"),
            NamigatorError::BinaryStreamCompressFailed => {
                f.write_str("BinaryStream::Compress failed")
            }
            NamigatorError::MzInflateinitFailed => f.write_str("mz_inflateInit failed"),
            NamigatorError::MzInflateFailed => f.write_str("mz_inflate failed"),
            NamigatorError::InvalidRowColumnFromDbc => f.write_str("Invalid row, column from DBC"),
            NamigatorError::GameobjectWithSpecifiedGuidAlreadyExists => {
                f.write_str("Gameobject with specified GUID already exists")
            }
            NamigatorError::TemporaryWmoObstaclesAreNotSupported => {
                f.write_str("Temporary WMO obstacles are not supported")
            }
            NamigatorError::NoDoodadSetSpecifiedForWmoGameObject => {
                f.write_str("No doodads specified for WMO gameobject")
            }
            NamigatorError::BadMatrixRow => f.write_str("Bad matrix row"),
            NamigatorError::InvalidMatrixMultiplication => {
                f.write_str("Invalid matrix multiplication")
            }
            NamigatorError::Only4x4MatrixIsSupported => f.write_str("Only 4x4 matrix is supported"),
            NamigatorError::MatrixNotInvertible => f.write_str("Matrix not invertible"),
            NamigatorError::UnexpectedVersionMagicInAlphaModel => {
                f.write_str("Unexpected version magic in alpha model")
            }
            NamigatorError::UnexpectedVersionSizeInAlphaModel => {
                f.write_str("Unexpected version size in alpha model")
            }
            NamigatorError::UnsupportedAlphaModelVersion => {
                f.write_str("Unsupported alpha model version")
            }
            NamigatorError::UnexpectedVertexMagicInAlphaModel => {
                f.write_str("Unexpected vertex magic in alpha model")
            }
            NamigatorError::UnexpectedTriangleMagicInAlphaModel => {
                f.write_str("Unexpected triangle magic in alpha model")
            }
            NamigatorError::InvalidDoodadFile => f.write_str("Invalid doodad file"),
            NamigatorError::CouldNotOpenMpq => f.write_str("Could not open MPQ"),
            NamigatorError::GetRootAreaIdInvalidId => f.write_str("GetRootAreaId invalid id"),
            NamigatorError::NoDataFilesFound => f.write_str("No data files found"),
            NamigatorError::MpqManagerNotIniatialized => {
                f.write_str("MpqManager is not initialized")
            }
            NamigatorError::ErrorInSFileOpenFileEx => f.write_str("Error in SFileOpenFileEx"),
            NamigatorError::ErrorInSFileReadFile => f.write_str("Error in SFileReadFile"),
            NamigatorError::MultipleCandidatesInAlphaMpq => {
                f.write_str("Multiple candidates in alpha MPQ")
            }
            NamigatorError::TooManyFilesInAlphaMpq => f.write_str("Too many files in alpha MPQ"),
            NamigatorError::NoMpqCandidate => f.write_str("No MPQ candidate"),
            NamigatorError::RecastFailure => f.write_str("Recast failure"),
            NamigatorError::BufferTooSmall => f.write_str("Buffer too small"),
            NamigatorError::UnknownPath => f.write_str("Unknown path"),
            NamigatorError::UnknownHeight => f.write_str("Unknown height"),
            NamigatorError::UnknownZoneAndArea => f.write_str("Unknown zone and area"),
            NamigatorError::FailedToLoadAdt => f.write_str("Failed to load ADT"),
            NamigatorError::MapDoesNotHaveAdt => f.write_str("Map does not have ADT"),
            NamigatorError::MapIsNullPointer => f.write_str("Map is null pointer"),
            NamigatorError::FailedToFindPointBetweenVectors => {
                f.write_str("Failed to find point between vectors")
            }
        }
    }
}

impl std::error::Error for NamigatorError {}

impl From<NulError> for NamigatorError {
    fn from(e: NulError) -> Self {
        Self::CStringConversion(e)
    }
}