picard/
lib.rs

1#![feature(proc_macro_span)]
2
3use std::path::PathBuf;
4
5use proc_macro::{TokenStream};
6use proc_macro::Span;
7use quote::quote;
8use syn::{parse_macro_input, LitStr, spanned::Spanned};
9
10
11/// Compiles a shader file, and includes the binary as a byte array.
12#[proc_macro]
13pub fn shader(input: TokenStream) -> TokenStream {
14    //shader_macro(input)
15    todo!()
16}
17/*
18fn shader_macro(input: TokenStream) -> TokenStream {
19    let filename = parse_macro_input!(input as LitStr).value();
20
21    let path = get_shader_path(&filename);
22
23    let file = match std::fs::read_to_string(&path) {
24        Ok(s) => s,
25        Err(e) => {
26            return syn::Error::new(filename.span(), format!("Error while opening shader file: {}.", e))
27            .to_compile_error()
28            .into();
29        }
30    };
31
32    let mut assembler = picard_core::ShaderAssembler::new();
33
34    let shader = match assembler.assemble_shader(&file) {
35        Ok(s) => s.into_vec(),
36        Err(e) => {
37            return syn::Error::new(filename.span(), format!("Error while compiling shader: {}.", e))
38            .to_compile_error()
39            .into();
40        }
41    };
42
43    let out = quote! {
44        [#(#shader),*]
45    };
46
47    out.into()
48}
49*/
50fn get_shader_path(filename: &str) -> PathBuf {
51    let file = Span::call_site().source_file();
52
53    // This is to make it behave kinda like include_bytes! with the path
54    file.path().with_file_name(filename)
55}
56
57
58/// Compiles an inline shader, and includes the binary as a byte array.
59#[proc_macro]
60pub fn pica(input: TokenStream) -> TokenStream {
61    //pica_macro(input)
62    todo!()
63}
64/* 
65fn pica_macro(input: TokenStream) -> TokenStream {
66    let file = parse_macro_input!(input as LitStr).value();
67
68    let mut assembler = picard_core::ShaderAssembler::new();
69    let shader = match assembler.assemble_shader(&file) {
70        Ok(s) => s.into_vec(),
71        Err(e) => {
72            return syn::Error::new(file.span(), format!("Error while compiling shader: {}.", e))
73            .to_compile_error()
74            .into();
75        }
76    };
77
78    let out = quote! {
79        [#(#shader),*]
80    };
81
82    out.into()
83}
84*/