Read file contents to binary within macro
This commit is contained in:
		
							parent
							
								
									480ba5155a
								
							
						
					
					
						commit
						140d963d9b
					
				| @ -1,4 +1,4 @@ | |||||||
| fn main() -> u32 { | fn main() -> u8 { | ||||||
|     // let message = String::from(include_bytes!("./macro_easy_file.txt")); |     // let message = String::from(include_bytes!("./macro_easy_file.txt")); | ||||||
|     return test_macro!(); |     return test_macro!("./examples/macro_easy_file.txt"); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| use std::collections::HashMap; | use std::collections::HashMap; | ||||||
| 
 | 
 | ||||||
| use crate::mir::{self, FunctionCall, GlobalKind, GlobalValue, IfExpression, Literal, WhileStatement}; | use crate::mir::{self, FunctionCall, GlobalKind, GlobalValue, IfExpression, Literal, TypeKind, WhileStatement}; | ||||||
| 
 | 
 | ||||||
| use super::pass::{Pass, PassResult, PassState}; | use super::pass::{Pass, PassResult, PassState}; | ||||||
| 
 | 
 | ||||||
| @ -16,6 +16,12 @@ pub enum ErrorKind { | |||||||
|     NoSuchMacro(String), |     NoSuchMacro(String), | ||||||
|     #[error("Macro arguments may only be literals")] |     #[error("Macro arguments may only be literals")] | ||||||
|     InvalidMacroArgs, |     InvalidMacroArgs, | ||||||
|  |     #[error("Got {0} parameters, expected {1}")] | ||||||
|  |     InvalidAmountOfParams(u32, u32), | ||||||
|  |     #[error("Expected argument type of {0}, got {1}")] | ||||||
|  |     InvalidArgumentType(TypeKind, TypeKind), | ||||||
|  |     #[error("Error executing macro: {0}")] | ||||||
|  |     MacroExecutionError(String), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Struct used to implement a type-checking pass that can be performed on the
 | /// Struct used to implement a type-checking pass that can be performed on the
 | ||||||
| @ -183,11 +189,32 @@ pub fn form_macros() -> HashMap<String, Box<dyn MacroFunction>> { | |||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct TestMacro; | pub struct TestMacro; | ||||||
| impl MacroFunction for TestMacro { | impl MacroFunction for TestMacro { | ||||||
|     fn generate<'ctx, 'a>(&self, _: &[mir::Literal]) -> Result<(Vec<GlobalValue>, mir::ExprKind), ErrorKind> { |     fn generate<'ctx, 'a>(&self, literals: &[mir::Literal]) -> Result<(Vec<GlobalValue>, mir::ExprKind), ErrorKind> { | ||||||
|  |         if literals.len() != 1 { | ||||||
|  |             return Err(ErrorKind::InvalidAmountOfParams(literals.len() as u32, 1)); | ||||||
|  |         } | ||||||
|  |         let literal = literals.get(0).unwrap(); | ||||||
|  |         let Literal::String(path) = literal else { | ||||||
|  |             return Err(ErrorKind::InvalidArgumentType( | ||||||
|  |                 literal.as_type(), | ||||||
|  |                 TypeKind::UserPtr(Box::new(TypeKind::Char)), | ||||||
|  |             )); | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let contents = match std::fs::read(path) { | ||||||
|  |             Ok(content) => content, | ||||||
|  |             Err(e) => return Err(ErrorKind::MacroExecutionError(format!("{}", e))), | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let literals = contents | ||||||
|  |             .iter() | ||||||
|  |             .map(|c| GlobalKind::Literal(Literal::U8(*c))) | ||||||
|  |             .collect::<Vec<_>>(); | ||||||
|  | 
 | ||||||
|         Ok(( |         Ok(( | ||||||
|             vec![GlobalValue { |             vec![GlobalValue { | ||||||
|                 name: "sometestglobalvalue".to_owned(), |                 name: "sometestglobalvalue".to_owned(), | ||||||
|                 kind: GlobalKind::Array(vec![GlobalKind::Literal(Literal::I16(12))]), |                 kind: GlobalKind::Array(literals), | ||||||
|             }], |             }], | ||||||
|             mir::ExprKind::Literal(mir::Literal::Vague(mir::VagueLiteral::Number(5))), |             mir::ExprKind::Literal(mir::Literal::Vague(mir::VagueLiteral::Number(5))), | ||||||
|         )) |         )) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user