1use 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}