ghx_proc_gen/
lib.rs

1#![warn(missing_docs)]
2
3//! A library for 2D & 3D procedural generation with Model synthesis/Wave function Collapse.
4//! Also provide grid utilities to manipulate 2d & 3d grid data.
5
6use generator::model::{ModelIndex, ModelRotation, ModelVariantIndex};
7use ghx_grid::grid::GridIndex;
8
9pub use ghx_grid;
10
11/// Model synthesis/Wave function Collapse generator
12pub mod generator;
13
14/// Our grid elements are called Nodes
15pub type NodeIndex = GridIndex;
16
17/// Error returned by a [`generator::Generator`] when a generation fails
18#[derive(thiserror::Error, Debug, Clone, Copy)]
19#[error("Failed to generate, contradiction at node with index {}", node_index)]
20pub struct GeneratorError {
21    /// Node index at which the contradiction occurred
22    pub node_index: NodeIndex,
23}
24
25/// Error returned by a [`generator::rules::RulesBuilder`] when correct [`generator::rules::Rules`] cannot be built
26#[derive(thiserror::Error, Debug, Clone, Copy)]
27pub enum RulesBuilderError {
28    /// Rules cannot be built without models or sockets
29    #[error("Empty models or sockets collection")]
30    NoModelsOrSockets,
31}
32
33/// Error returned by a [`generator::Generator`] when a node set operation fails
34#[derive(thiserror::Error, Debug, Clone)]
35pub enum NodeSetError {
36    /// An invalid [`ModelVariantIndex`] was given
37    #[error("Invalid model variant index `{0}`, does not exist in the rules")]
38    InvalidModelIndex(ModelVariantIndex),
39    /// An invalid [`generator::rules::ModelVariantRef`] was given
40    #[error("Invalid model variant reference: model index `{0}` with rotation `{1:?}`, does not exist in the rules")]
41    InvalidModelRef(ModelIndex, ModelRotation),
42    /// An invalid node index was given
43    #[error("Invalid node index `{0}`, does not exist in the grid")]
44    InvalidNodeIndex(NodeIndex),
45    /// An operation requested to set a model on a node that does not allow it
46    #[error("Model variant `{0}` not allowed by the Rules on node {1}")]
47    IllegalModel(ModelVariantIndex, NodeIndex),
48    /// Wraps a [`GeneratorError`]
49    #[error("Generation error: {0}")]
50    GenerationError(#[from] GeneratorError),
51}
52
53/// Errors returned by a [`generator::builder::GeneratorBuilder`]
54#[derive(thiserror::Error, Debug, Clone)]
55pub enum GeneratorBuilderError {
56    /// Error returned by a [`generator::builder::GeneratorBuilder`] when a node set operation fails
57    #[error("Initial node set error: {0}")]
58    InitialNodeSetError(#[from] NodeSetError),
59    /// Error returned by a [`generator::builder::GeneratorBuilder`] when a given grid does not match the size of the builder's grid.
60    #[error("Given grid size {0:?} does not match the expected size {1:?}")]
61    InvalidGridSize(usize, usize),
62}