1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4pub use use_biodiversity as biodiversity;
5pub use use_biome as biome;
6pub use use_community as community;
7pub use use_conservation_status as conservation_status;
8pub use use_ecosystem as ecosystem;
9pub use use_food_web as food_web;
10pub use use_habitat as habitat;
11pub use use_niche as niche;
12pub use use_population as population;
13pub use use_species_interaction as species_interaction;
14pub use use_trophic_level as trophic_level;
15
16pub mod prelude {
18 pub use use_biodiversity::{
19 BiodiversityMeasure, BiodiversityValueError, DiversityIndex, DiversityIndexKind,
20 DiversityIndexKindParseError, SpeciesRichness,
21 };
22 pub use use_biome::{BiomeClimate, BiomeKind, BiomeKindParseError, BiomeName, BiomeTextError};
23 pub use use_community::{
24 CommunityComposition, CommunityKind, CommunityKindParseError, CommunityName, CommunityRole,
25 CommunityRoleParseError, CommunityTextError,
26 };
27 pub use use_conservation_status::{
28 ConservationStatus, ConservationStatusParseError, ConservationStatusSystem,
29 ConservationTextError, ProtectionStatus, ThreatKind, ThreatKindParseError,
30 };
31 pub use use_ecosystem::{
32 EcosystemComponent, EcosystemKind, EcosystemKindParseError, EcosystemName, EcosystemScale,
33 EcosystemScaleParseError, EcosystemTextError,
34 };
35 pub use use_food_web::{
36 EnergyFlowDirection, EnergyFlowDirectionParseError, FeedingRelation,
37 FeedingRelationParseError, FoodWebLink, FoodWebName, FoodWebTextError,
38 };
39 pub use use_habitat::{
40 HabitatCondition, HabitatConditionParseError, HabitatFeature, HabitatKind,
41 HabitatKindParseError, HabitatName, HabitatTextError,
42 };
43 pub use use_niche::{
44 NicheBreadth, NicheKind, NicheKindParseError, NicheName, NicheTextError, NicheValueError,
45 ResourceUse,
46 };
47 pub use use_population::{
48 PopulationDensity, PopulationId, PopulationName, PopulationSize, PopulationTextError,
49 PopulationTrend, PopulationTrendParseError, PopulationValueError,
50 };
51 pub use use_species_interaction::{
52 InteractionStrength, InteractionStrengthParseError, InteractionTextError,
53 SpeciesInteraction, SpeciesInteractionKind, SpeciesInteractionKindParseError,
54 };
55 pub use use_trophic_level::{
56 TrophicLevel, TrophicLevelParseError, TrophicPosition, TrophicRole, TrophicTextError,
57 TrophicValueError,
58 };
59}
60
61#[cfg(test)]
62mod tests {
63 use super::prelude::{
64 BiodiversityMeasure, BiomeKind, CommunityRole, ConservationStatus, EcosystemKind,
65 FeedingRelation, FoodWebLink, HabitatKind, NicheKind, PopulationSize, SpeciesInteraction,
66 SpeciesInteractionKind, SpeciesRichness, TrophicLevel,
67 };
68
69 #[test]
70 fn facade_composes_ecology_primitives_without_simulation() {
71 let ecosystem = EcosystemKind::Marine;
72 let habitat = HabitatKind::Reef;
73 let population = PopulationSize::new(150).expect("non-negative population");
74 let role = CommunityRole::Keystone;
75 let niche = NicheKind::Trophic;
76 let biome = BiomeKind::Marine;
77 let link = FoodWebLink::new("zooplankton", "anchovy", FeedingRelation::Consumes)
78 .expect("valid food-web link");
79 let interaction =
80 SpeciesInteraction::new("coral", "algae", SpeciesInteractionKind::Mutualism)
81 .expect("valid species interaction");
82 let trophic = TrophicLevel::PrimaryConsumer;
83 let richness = SpeciesRichness::new(128).expect("non-negative richness");
84 let biodiversity = BiodiversityMeasure::SpeciesRichness(richness);
85 let status = ConservationStatus::Vulnerable;
86
87 assert_eq!(ecosystem.to_string(), "marine");
88 assert_eq!(habitat.to_string(), "reef");
89 assert_eq!(population.get(), 150);
90 assert_eq!(role.to_string(), "keystone");
91 assert_eq!(niche.to_string(), "trophic");
92 assert_eq!(biome.to_string(), "marine");
93 assert_eq!(link.to_string(), "zooplankton -[consumes]-> anchovy");
94 assert_eq!(interaction.to_string(), "coral -[mutualism]-> algae");
95 assert_eq!(trophic.to_string(), "primary-consumer");
96 assert_eq!(biodiversity.to_string(), "species-richness: 128");
97 assert_eq!(status.to_string(), "vulnerable");
98 }
99}