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*/