wgsl_spec/
lib.rs

1#[cfg(feature = "scrape")]
2pub mod scrape;
3
4use std::collections::BTreeMap;
5
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Serialize, Deserialize)]
9pub struct TokenInfo {
10    pub keywords: Vec<String>,
11    pub attributes: BTreeMap<String, Attribute>,
12    pub builtin_values: BTreeMap<String, BuiltinValue>,
13    pub interpolation_type_names: Vec<String>,
14    pub interpolation_sampling_names: Vec<String>,
15    pub primitive_types: Vec<String>,
16    pub type_generators: Vec<String>,
17    pub type_aliases: BTreeMap<String, String>,
18}
19
20#[derive(Debug, Serialize, Deserialize)]
21pub struct Attribute {
22    pub description: String,
23    pub description_parameters: Option<String>,
24}
25
26#[derive(Debug, Serialize, Deserialize)]
27pub struct BuiltinValue {
28    pub stages: BTreeMap<String, BuiltinValueStage>,
29    pub typ: String,
30}
31
32#[derive(Debug, Serialize, Deserialize)]
33pub struct BuiltinValueStage {
34    pub description: String,
35    pub direction: BuiltinValueDirection,
36}
37
38#[derive(Debug, Serialize, Deserialize)]
39pub enum BuiltinValueDirection {
40    Input,
41    Output,
42}
43
44#[derive(Debug, Serialize, Deserialize)]
45#[serde(transparent)]
46pub struct FunctionInfo {
47    pub functions: BTreeMap<String, Function>,
48}
49
50#[derive(Debug, Serialize, Deserialize)]
51pub struct Function {
52    pub overloads: Vec<FunctionOverload>,
53    pub parameters: Vec<FunctionParameter>,
54    pub description: Option<String>,
55}
56
57#[derive(Debug, Serialize, Deserialize)]
58pub struct FunctionParameter {
59    pub name: String,
60    pub description: String,
61}
62
63#[derive(Debug, Serialize, Deserialize)]
64pub struct FunctionOverload {
65    pub signature: String,
66    pub parameterization: Parameterization,
67    pub description: Option<String>,
68}
69
70/// Dsecribes the valid values for a set of variables.
71#[derive(Debug, Default, Serialize, Deserialize)]
72#[serde(transparent)]
73pub struct Parameterization {
74    pub typevars: BTreeMap<String, ParameterizationKind>,
75}
76
77#[derive(Debug, Serialize, Deserialize)]
78#[serde(rename_all = "snake_case")]
79pub enum ParameterizationKind {
80    /// A list of types.
81    Types(Vec<String>),
82    /// A human-readable description.
83    Description(String),
84}
85
86#[cfg(feature = "include")]
87pub mod include {
88    pub const TOKENS_JSON: &str = include_str!("../spec/tokens.json");
89    pub const FUNCTIONS_JSON: &str = include_str!("../spec/functions.json");
90
91    pub fn tokens() -> serde_json::Result<crate::TokenInfo> {
92        serde_json::from_slice(TOKENS_JSON.as_bytes())
93    }
94
95    pub fn functions() -> serde_json::Result<crate::FunctionInfo> {
96        serde_json::from_slice(FUNCTIONS_JSON.as_bytes())
97    }
98}