main/
main.rs

1use std::path::Path;
2
3use shader_sense::{
4    shader::{GlslShadingLanguageTag, ShaderParams, ShadingLanguageTag},
5    symbols::{
6        shader_module_parser::ShaderModuleParser,
7        symbol_provider::{default_include_callback, SymbolProvider},
8    },
9    validator::validator::Validator,
10};
11
12fn validate_file<T: ShadingLanguageTag>(shader_path: &Path, shader_content: &str) {
13    // Validator intended to validate a file using standard API.
14    let validator = Validator::from_shading_language(T::get_language());
15    match validator.validate_shader(
16        shader_content,
17        shader_path,
18        &ShaderParams::default(),
19        &mut |path: &Path| Some(std::fs::read_to_string(path).unwrap()),
20    ) {
21        Ok(diagnostic_list) => println!(
22            "Validated file and return following diagnostics: {:#?}",
23            diagnostic_list
24        ),
25        Err(err) => println!("Failed to validate file: {:#?}", err),
26    }
27}
28
29fn query_all_symbol<T: ShadingLanguageTag>(shader_path: &Path, shader_content: &str) {
30    // SymbolProvider intended to gather file symbol at runtime by inspecting the AST.
31    let mut shader_module_parser = ShaderModuleParser::from_shading_language(T::get_language());
32    let symbol_provider = SymbolProvider::from_shading_language(T::get_language());
33    match shader_module_parser.create_module(shader_path, shader_content) {
34        Ok(shader_module) => {
35            let symbols = symbol_provider
36                .query_symbols(
37                    &shader_module,
38                    ShaderParams::default(),
39                    &mut default_include_callback::<T>,
40                    None,
41                )
42                .unwrap();
43            let symbol_list = symbols.get_all_symbols();
44            println!("Found symbols: {:#?}", symbol_list);
45        }
46        Err(err) => println!("Failed to create ast: {:#?}", err),
47    }
48}
49
50const SHADER: &str = r#"
51#version 450
52void symbol(uint i) {}
53void symbol(float b) {}
54void main() {
55    vec4 frags = gl_FragCoord;
56}
57"#;
58
59fn main() {
60    let shader_path = Path::new("dummy/shader.frag.glsl");
61    validate_file::<GlslShadingLanguageTag>(shader_path, SHADER);
62    query_all_symbol::<GlslShadingLanguageTag>(shader_path, SHADER);
63}