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