(args: &CmdlineOptions)
| 167 | } |
| 168 | |
| 169 | fn build_rune_script(args: &CmdlineOptions) -> eyre::Result<rune::Source> { |
| 170 | let mut lines = Vec::new(); |
| 171 | lines.push("pub fn iterate(x, y) {".into()); |
| 172 | lines.push("// parameters".into()); |
| 173 | // Add the alphabetic parameters first |
| 174 | if let Some(letters) = &args.letters { |
| 175 | let mut params = params_from_letters(letters)?; |
| 176 | lines.append(&mut params); |
| 177 | } |
| 178 | |
| 179 | // Add the explicit parameters second (allows overrides if you so wanted) |
| 180 | for parameter in &args.parameter { |
| 181 | lines.push(format!("let {parameter};")); |
| 182 | } |
| 183 | |
| 184 | // Add the script if given |
| 185 | if let Some(script) = &args.script { |
| 186 | lines.push("// script".into()); |
| 187 | if script == "-" { |
| 188 | for maybe_line in std::io::stdin().lock().lines() { |
| 189 | let line = maybe_line?; |
| 190 | lines.push(line); |
| 191 | } |
| 192 | } else { |
| 193 | let file = std::fs::File::open(script)?; |
| 194 | let reader = std::io::BufReader::new(file); |
| 195 | for maybe_line in reader.lines() { |
| 196 | let line = maybe_line?; |
| 197 | lines.push(line); |
| 198 | } |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | // Finally append any --math expressions |
| 203 | if !args.math.is_empty() { |
| 204 | lines.push("// math".into()); |
| 205 | } |
| 206 | lines.append(&mut args.math.clone()); |
| 207 | |
| 208 | lines.push("return (x_new, y_new);".into()); |
| 209 | lines.push("}".into()); |
| 210 | let script = lines.join("\n"); |
| 211 | tracing::debug!("Generated rune script:\n==========\n{script}\n=========="); |
| 212 | let source = rune::Source::memory(script)?; |
| 213 | Ok(source) |
| 214 | } |
| 215 | |
| 216 | fn main() -> eyre::Result<()> { |
| 217 | color_eyre::install()?; |
no test coverage detected