Skip to main content

nil_lua/
script.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use crate::Lua;
5use crate::error::Result;
6use crate::stdio::StdioMessage;
7use serde::{Deserialize, Serialize};
8use std::ffi::OsStr;
9use std::path::PathBuf;
10use tokio::fs;
11
12#[derive(Clone, Debug, Deserialize, Serialize)]
13#[serde(rename_all = "camelCase")]
14pub struct Script {
15  pub name: String,
16  pub chunk: String,
17  pub path: PathBuf,
18}
19
20impl Script {
21  pub async fn load(path: PathBuf) -> Result<Self> {
22    let chunk = fs::read_to_string(&path).await?;
23    let name = path
24      .file_stem()
25      .and_then(OsStr::to_str)
26      .map(ToOwned::to_owned)
27      .unwrap_or_else(|| String::from("Script"));
28
29    Ok(Self { name, chunk, path })
30  }
31
32  pub async fn execute(&self, lua: &mut Lua) -> Result<ScriptOutput> {
33    lua.execute(&self.chunk).await
34  }
35}
36
37#[derive(Clone, Debug, Deserialize, Serialize)]
38#[serde(rename_all = "camelCase")]
39pub struct ScriptOutput {
40  pub stdout: Vec<StdioMessage>,
41  pub stderr: Vec<StdioMessage>,
42}