Skip to main content

ifc_style/
coverage.rs

1//! Auditable IFC4 ADD2 presentation-appearance declaration census.
2//!
3//! `StrictView` means this crate exposes a dedicated typed projection. Schema
4//! declarations and structural-only entities remain available through lower layers,
5//! but are deliberately not advertised as typed style contracts.
6
7/// The syntactic kind of an IFC4 ADD2 presentation-appearance schema
8/// declaration: an entity, a defined/select type, or a global rule function.
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum AppearanceKind {
11    /// An `ENTITY` declaration.
12    Entity,
13    /// A `TYPE` declaration (defined type or select).
14    Type,
15    /// A global `FUNCTION` rule (e.g. `IfcCorrectFillAreaStyle`).
16    Function,
17}
18
19/// How thoroughly this crate exposes a given IFC4 ADD2 presentation-appearance
20/// schema declaration.
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22#[non_exhaustive]
23pub enum AppearanceSupport {
24    /// Exposed as a dedicated typed `*View`/projection struct in this crate.
25    StrictView,
26    /// Read as a raw schema-level value (e.g. an enum token) without a
27    /// dedicated view type.
28    SchemaValue,
29    /// A schema-defined global rule; not something this crate evaluates.
30    SchemaRule,
31    /// Present in the schema but consumed only structurally (e.g. as an
32    /// intermediate select member), with no standalone typed contract.
33    StructuralOnly,
34}
35
36/// One census entry: an IFC4 ADD2 presentation-appearance schema declaration
37/// paired with how this crate supports it.
38#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39#[non_exhaustive]
40pub struct AppearanceDeclaration {
41    /// The schema declaration's name, e.g. `"IfcSurfaceStyle"`.
42    pub name: &'static str,
43    /// Whether the declaration is an entity, type, or function.
44    pub kind: AppearanceKind,
45    /// How thoroughly this crate supports the declaration.
46    pub support: AppearanceSupport,
47}
48
49/// The full, test-verified census of IFC4 ADD2 presentation-appearance
50/// schema declarations and how this crate supports each one.
51pub const APPEARANCE_DECLARATIONS: &[AppearanceDeclaration] = &[
52    AppearanceDeclaration {
53        name: "IfcBlobTexture",
54        kind: AppearanceKind::Entity,
55        support: AppearanceSupport::StrictView,
56    },
57    AppearanceDeclaration {
58        name: "IfcColour",
59        kind: AppearanceKind::Type,
60        support: AppearanceSupport::SchemaValue,
61    },
62    AppearanceDeclaration {
63        name: "IfcColourOrFactor",
64        kind: AppearanceKind::Type,
65        support: AppearanceSupport::StrictView,
66    },
67    AppearanceDeclaration {
68        name: "IfcColourRgb",
69        kind: AppearanceKind::Entity,
70        support: AppearanceSupport::StrictView,
71    },
72    AppearanceDeclaration {
73        name: "IfcColourRgbList",
74        kind: AppearanceKind::Entity,
75        support: AppearanceSupport::StructuralOnly,
76    },
77    AppearanceDeclaration {
78        name: "IfcColourSpecification",
79        kind: AppearanceKind::Entity,
80        support: AppearanceSupport::StructuralOnly,
81    },
82    AppearanceDeclaration {
83        name: "IfcCorrectFillAreaStyle",
84        kind: AppearanceKind::Function,
85        support: AppearanceSupport::SchemaRule,
86    },
87    AppearanceDeclaration {
88        name: "IfcCurveFontOrScaledCurveFontSelect",
89        kind: AppearanceKind::Type,
90        support: AppearanceSupport::SchemaValue,
91    },
92    AppearanceDeclaration {
93        name: "IfcCurveStyle",
94        kind: AppearanceKind::Entity,
95        support: AppearanceSupport::StrictView,
96    },
97    AppearanceDeclaration {
98        name: "IfcCurveStyleFont",
99        kind: AppearanceKind::Entity,
100        support: AppearanceSupport::StrictView,
101    },
102    AppearanceDeclaration {
103        name: "IfcCurveStyleFontAndScaling",
104        kind: AppearanceKind::Entity,
105        support: AppearanceSupport::StructuralOnly,
106    },
107    AppearanceDeclaration {
108        name: "IfcCurveStyleFontPattern",
109        kind: AppearanceKind::Entity,
110        support: AppearanceSupport::StrictView,
111    },
112    AppearanceDeclaration {
113        name: "IfcCurveStyleFontSelect",
114        kind: AppearanceKind::Type,
115        support: AppearanceSupport::SchemaValue,
116    },
117    AppearanceDeclaration {
118        name: "IfcDraughtingPreDefinedColour",
119        kind: AppearanceKind::Entity,
120        support: AppearanceSupport::StructuralOnly,
121    },
122    AppearanceDeclaration {
123        name: "IfcDraughtingPreDefinedCurveFont",
124        kind: AppearanceKind::Entity,
125        support: AppearanceSupport::StructuralOnly,
126    },
127    AppearanceDeclaration {
128        name: "IfcExternallyDefinedHatchStyle",
129        kind: AppearanceKind::Entity,
130        support: AppearanceSupport::StructuralOnly,
131    },
132    AppearanceDeclaration {
133        name: "IfcExternallyDefinedSurfaceStyle",
134        kind: AppearanceKind::Entity,
135        support: AppearanceSupport::StructuralOnly,
136    },
137    AppearanceDeclaration {
138        name: "IfcExternallyDefinedTextFont",
139        kind: AppearanceKind::Entity,
140        support: AppearanceSupport::StructuralOnly,
141    },
142    AppearanceDeclaration {
143        name: "IfcFillAreaStyle",
144        kind: AppearanceKind::Entity,
145        support: AppearanceSupport::StrictView,
146    },
147    AppearanceDeclaration {
148        name: "IfcFillAreaStyleHatching",
149        kind: AppearanceKind::Entity,
150        support: AppearanceSupport::StrictView,
151    },
152    AppearanceDeclaration {
153        name: "IfcFillAreaStyleTiles",
154        kind: AppearanceKind::Entity,
155        support: AppearanceSupport::StrictView,
156    },
157    AppearanceDeclaration {
158        name: "IfcFillStyleSelect",
159        kind: AppearanceKind::Type,
160        support: AppearanceSupport::SchemaValue,
161    },
162    AppearanceDeclaration {
163        name: "IfcFontStyle",
164        kind: AppearanceKind::Type,
165        support: AppearanceSupport::SchemaValue,
166    },
167    AppearanceDeclaration {
168        name: "IfcFontVariant",
169        kind: AppearanceKind::Type,
170        support: AppearanceSupport::SchemaValue,
171    },
172    AppearanceDeclaration {
173        name: "IfcFontWeight",
174        kind: AppearanceKind::Type,
175        support: AppearanceSupport::SchemaValue,
176    },
177    AppearanceDeclaration {
178        name: "IfcHatchLineDistanceSelect",
179        kind: AppearanceKind::Type,
180        support: AppearanceSupport::SchemaValue,
181    },
182    AppearanceDeclaration {
183        name: "IfcImageTexture",
184        kind: AppearanceKind::Entity,
185        support: AppearanceSupport::StrictView,
186    },
187    AppearanceDeclaration {
188        name: "IfcIndexedColourMap",
189        kind: AppearanceKind::Entity,
190        support: AppearanceSupport::StructuralOnly,
191    },
192    AppearanceDeclaration {
193        name: "IfcIndexedTextureMap",
194        kind: AppearanceKind::Entity,
195        support: AppearanceSupport::StrictView,
196    },
197    AppearanceDeclaration {
198        name: "IfcIndexedTriangleTextureMap",
199        kind: AppearanceKind::Entity,
200        support: AppearanceSupport::StrictView,
201    },
202    AppearanceDeclaration {
203        name: "IfcNullStyle",
204        kind: AppearanceKind::Type,
205        support: AppearanceSupport::SchemaValue,
206    },
207    AppearanceDeclaration {
208        name: "IfcPixelTexture",
209        kind: AppearanceKind::Entity,
210        support: AppearanceSupport::StrictView,
211    },
212    AppearanceDeclaration {
213        name: "IfcPreDefinedColour",
214        kind: AppearanceKind::Entity,
215        support: AppearanceSupport::StructuralOnly,
216    },
217    AppearanceDeclaration {
218        name: "IfcPreDefinedCurveFont",
219        kind: AppearanceKind::Entity,
220        support: AppearanceSupport::StructuralOnly,
221    },
222    AppearanceDeclaration {
223        name: "IfcPreDefinedItem",
224        kind: AppearanceKind::Entity,
225        support: AppearanceSupport::StructuralOnly,
226    },
227    AppearanceDeclaration {
228        name: "IfcPreDefinedTextFont",
229        kind: AppearanceKind::Entity,
230        support: AppearanceSupport::StructuralOnly,
231    },
232    AppearanceDeclaration {
233        name: "IfcPresentableText",
234        kind: AppearanceKind::Type,
235        support: AppearanceSupport::SchemaValue,
236    },
237    AppearanceDeclaration {
238        name: "IfcPresentationStyle",
239        kind: AppearanceKind::Entity,
240        support: AppearanceSupport::StructuralOnly,
241    },
242    AppearanceDeclaration {
243        name: "IfcPresentationStyleAssignment",
244        kind: AppearanceKind::Entity,
245        support: AppearanceSupport::StrictView,
246    },
247    AppearanceDeclaration {
248        name: "IfcPresentationStyleSelect",
249        kind: AppearanceKind::Type,
250        support: AppearanceSupport::SchemaValue,
251    },
252    AppearanceDeclaration {
253        name: "IfcReflectanceMethodEnum",
254        kind: AppearanceKind::Type,
255        support: AppearanceSupport::SchemaValue,
256    },
257    AppearanceDeclaration {
258        name: "IfcSizeSelect",
259        kind: AppearanceKind::Type,
260        support: AppearanceSupport::SchemaValue,
261    },
262    AppearanceDeclaration {
263        name: "IfcSpecularExponent",
264        kind: AppearanceKind::Type,
265        support: AppearanceSupport::SchemaValue,
266    },
267    AppearanceDeclaration {
268        name: "IfcSpecularHighlightSelect",
269        kind: AppearanceKind::Type,
270        support: AppearanceSupport::SchemaValue,
271    },
272    AppearanceDeclaration {
273        name: "IfcSpecularRoughness",
274        kind: AppearanceKind::Type,
275        support: AppearanceSupport::SchemaValue,
276    },
277    AppearanceDeclaration {
278        name: "IfcStyleAssignmentSelect",
279        kind: AppearanceKind::Type,
280        support: AppearanceSupport::SchemaValue,
281    },
282    AppearanceDeclaration {
283        name: "IfcStyledItem",
284        kind: AppearanceKind::Entity,
285        support: AppearanceSupport::StrictView,
286    },
287    AppearanceDeclaration {
288        name: "IfcSurfaceSide",
289        kind: AppearanceKind::Type,
290        support: AppearanceSupport::SchemaValue,
291    },
292    AppearanceDeclaration {
293        name: "IfcSurfaceStyle",
294        kind: AppearanceKind::Entity,
295        support: AppearanceSupport::StrictView,
296    },
297    AppearanceDeclaration {
298        name: "IfcSurfaceStyleElementSelect",
299        kind: AppearanceKind::Type,
300        support: AppearanceSupport::SchemaValue,
301    },
302    AppearanceDeclaration {
303        name: "IfcSurfaceStyleLighting",
304        kind: AppearanceKind::Entity,
305        support: AppearanceSupport::StrictView,
306    },
307    AppearanceDeclaration {
308        name: "IfcSurfaceStyleRefraction",
309        kind: AppearanceKind::Entity,
310        support: AppearanceSupport::StrictView,
311    },
312    AppearanceDeclaration {
313        name: "IfcSurfaceStyleRendering",
314        kind: AppearanceKind::Entity,
315        support: AppearanceSupport::StrictView,
316    },
317    AppearanceDeclaration {
318        name: "IfcSurfaceStyleShading",
319        kind: AppearanceKind::Entity,
320        support: AppearanceSupport::StrictView,
321    },
322    AppearanceDeclaration {
323        name: "IfcSurfaceStyleWithTextures",
324        kind: AppearanceKind::Entity,
325        support: AppearanceSupport::StrictView,
326    },
327    AppearanceDeclaration {
328        name: "IfcSurfaceTexture",
329        kind: AppearanceKind::Entity,
330        support: AppearanceSupport::StrictView,
331    },
332    AppearanceDeclaration {
333        name: "IfcTextAlignment",
334        kind: AppearanceKind::Type,
335        support: AppearanceSupport::SchemaValue,
336    },
337    AppearanceDeclaration {
338        name: "IfcTextDecoration",
339        kind: AppearanceKind::Type,
340        support: AppearanceSupport::SchemaValue,
341    },
342    AppearanceDeclaration {
343        name: "IfcTextFontName",
344        kind: AppearanceKind::Type,
345        support: AppearanceSupport::SchemaValue,
346    },
347    AppearanceDeclaration {
348        name: "IfcTextFontSelect",
349        kind: AppearanceKind::Type,
350        support: AppearanceSupport::SchemaValue,
351    },
352    AppearanceDeclaration {
353        name: "IfcTextStyle",
354        kind: AppearanceKind::Entity,
355        support: AppearanceSupport::StrictView,
356    },
357    AppearanceDeclaration {
358        name: "IfcTextStyleFontModel",
359        kind: AppearanceKind::Entity,
360        support: AppearanceSupport::StrictView,
361    },
362    AppearanceDeclaration {
363        name: "IfcTextStyleForDefinedFont",
364        kind: AppearanceKind::Entity,
365        support: AppearanceSupport::StructuralOnly,
366    },
367    AppearanceDeclaration {
368        name: "IfcTextStyleTextModel",
369        kind: AppearanceKind::Entity,
370        support: AppearanceSupport::StructuralOnly,
371    },
372    AppearanceDeclaration {
373        name: "IfcTextTransformation",
374        kind: AppearanceKind::Type,
375        support: AppearanceSupport::SchemaValue,
376    },
377    AppearanceDeclaration {
378        name: "IfcTextureCoordinate",
379        kind: AppearanceKind::Entity,
380        support: AppearanceSupport::StrictView,
381    },
382    AppearanceDeclaration {
383        name: "IfcTextureCoordinateGenerator",
384        kind: AppearanceKind::Entity,
385        support: AppearanceSupport::StrictView,
386    },
387    AppearanceDeclaration {
388        name: "IfcTextureMap",
389        kind: AppearanceKind::Entity,
390        support: AppearanceSupport::StructuralOnly,
391    },
392    AppearanceDeclaration {
393        name: "IfcTextureVertex",
394        kind: AppearanceKind::Entity,
395        support: AppearanceSupport::StrictView,
396    },
397    AppearanceDeclaration {
398        name: "IfcTextureVertexList",
399        kind: AppearanceKind::Entity,
400        support: AppearanceSupport::StrictView,
401    },
402];
403
404#[cfg(test)]
405mod tests {
406    use super::*;
407    use std::collections::BTreeSet;
408
409    #[test]
410    fn census_has_all_seventy_unique_ifc4_appearance_declarations() {
411        assert_eq!(APPEARANCE_DECLARATIONS.len(), 70);
412        let unique = APPEARANCE_DECLARATIONS
413            .iter()
414            .map(|declaration| declaration.name)
415            .collect::<BTreeSet<_>>();
416        assert_eq!(unique.len(), APPEARANCE_DECLARATIONS.len());
417        let schema = ifc_schema::ifc4();
418        for declaration in APPEARANCE_DECLARATIONS {
419            match declaration.kind {
420                AppearanceKind::Entity => assert!(schema.entity(declaration.name).is_some()),
421                AppearanceKind::Type => assert!(schema.type_def(declaration.name).is_some()),
422                AppearanceKind::Function => {}
423            }
424        }
425    }
426}