Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/builds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ async fn get_temp_credentials(
request_body["entrypoint"] = serde_json::json!(ep);
}

// Add entrypointParams if provided (for JSDOS/Ruffle)
// Add entrypointParams if provided (for JSDOS/Ruffle/Ren'Py)
if let Some(ep_params) = entrypoint_params {
request_body["entrypointParams"] = ep_params;
}
Expand Down
90 changes: 43 additions & 47 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,15 +147,10 @@ pub struct UnitySection {
pub version: String,
}

/// Shape for engines whose runtime is fetched as a single executable file
/// (plus an optional loader script). Used by JSDOS, Ruffle, and Ren'Py.
#[derive(Debug, Deserialize)]
pub struct JsDosSection {
pub version: String,
pub executable: String,
pub loader_url: Option<String>,
}

#[derive(Debug, Deserialize)]
pub struct RuffleSection {
pub struct ExecutableEngineSection {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

refactor here since we have 3 engines using the same pattern

pub version: String,
pub executable: String,
pub loader_url: Option<String>,
Expand All @@ -174,10 +169,13 @@ pub struct WavedashConfig {
pub unity: Option<UnitySection>,

#[serde(rename = "jsdos")]
pub jsdos: Option<JsDosSection>,
pub jsdos: Option<ExecutableEngineSection>,

#[serde(rename = "ruffle")]
pub ruffle: Option<RuffleSection>,
pub ruffle: Option<ExecutableEngineSection>,

#[serde(rename = "renpy")]
pub renpy: Option<ExecutableEngineSection>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
Expand All @@ -186,6 +184,7 @@ pub enum EngineKind {
Unity,
JsDos,
Ruffle,
RenPy,
}

impl EngineKind {
Expand All @@ -195,6 +194,7 @@ impl EngineKind {
EngineKind::Unity => "UNITY",
EngineKind::JsDos => "JSDOS",
EngineKind::Ruffle => "RUFFLE",
EngineKind::RenPy => "RENPY",
}
}
}
Expand Down Expand Up @@ -238,6 +238,7 @@ impl WavedashConfig {
self.unity.is_some().then_some(EngineKind::Unity),
self.jsdos.is_some().then_some(EngineKind::JsDos),
self.ruffle.is_some().then_some(EngineKind::Ruffle),
self.renpy.is_some().then_some(EngineKind::RenPy),
Comment thread
cloud9c marked this conversation as resolved.
Comment thread
cloud9c marked this conversation as resolved.
]
.into_iter()
.flatten()
Expand All @@ -247,23 +248,29 @@ impl WavedashConfig {
0 => Ok(None),
1 => Ok(Some(engines[0])),
_ => anyhow::bail!(
"Config must have at most one engine section: [godot], [unity], [jsdos], or [ruffle]"
"Config must have at most one engine section: [godot], [unity], [jsdos], [ruffle], or [renpy]"
),
}
}

/// Returns the section for the active executable-style engine, if any.
/// JSDOS, Ruffle, and Ren'Py all share the same shape; `engine_type()`
/// guarantees at most one of these is set at a time.
fn executable_section(&self) -> Option<&ExecutableEngineSection> {
self.jsdos
.as_ref()
.or(self.ruffle.as_ref())
.or(self.renpy.as_ref())
}

pub fn engine_version(&self) -> Option<&str> {
if let Some(ref godot) = self.godot {
Some(&godot.version)
} else if let Some(ref unity) = self.unity {
Some(&unity.version)
} else if let Some(ref jsdos) = self.jsdos {
Some(&jsdos.version)
} else if let Some(ref ruffle) = self.ruffle {
Some(&ruffle.version)
} else {
None
if let Some(godot) = &self.godot {
return Some(&godot.version);
}
if let Some(unity) = &self.unity {
return Some(&unity.version);
}
self.executable_section().map(|s| s.version.as_str())
}

/// Returns the entrypoint when no engine block is present.
Expand All @@ -279,38 +286,27 @@ impl WavedashConfig {
}
}

/// For JSDOS/Ruffle engines, returns the entrypointParams (executable + optional loader_url)
/// For executable-style engines (JSDOS/Ruffle/Ren'Py), returns the
/// entrypointParams (executable + optional loader_url).
pub fn executable_entrypoint_params(&self) -> Option<serde_json::Value> {
if let Some(ref jsdos) = self.jsdos {
let mut params = serde_json::json!({ "executable": jsdos.executable });
if let Some(ref loader_url) = jsdos.loader_url {
params["loaderUrl"] = serde_json::json!(loader_url);
}
Some(params)
} else if let Some(ref ruffle) = self.ruffle {
let mut params = serde_json::json!({ "executable": ruffle.executable });
if let Some(ref loader_url) = ruffle.loader_url {
self.executable_section().map(|s| {
let mut params = serde_json::json!({ "executable": s.executable });
if let Some(loader_url) = &s.loader_url {
params["loaderUrl"] = serde_json::json!(loader_url);
}
Some(params)
} else {
None
}
params
})
}

/// For JSDOS/Ruffle engines, returns all files that must exist in upload_dir
/// For executable-style engines (JSDOS/Ruffle/Ren'Py), returns all files
/// that must exist in upload_dir.
pub fn executable_files_to_validate(&self) -> Vec<&str> {
let mut files = Vec::new();
if let Some(ref jsdos) = self.jsdos {
files.push(jsdos.executable.as_str());
if let Some(ref loader_url) = jsdos.loader_url {
files.push(loader_url.as_str());
}
} else if let Some(ref ruffle) = self.ruffle {
files.push(ruffle.executable.as_str());
if let Some(ref loader_url) = ruffle.loader_url {
files.push(loader_url.as_str());
}
let Some(s) = self.executable_section() else {
return Vec::new();
};
let mut files = vec![s.executable.as_str()];
if let Some(loader_url) = &s.loader_url {
files.push(loader_url);
}
files
}
Expand Down
2 changes: 1 addition & 1 deletion src/dev/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ pub async fn handle_dev(config_path: Option<PathBuf>, verbose: bool) -> Result<(
.ok_or_else(|| anyhow::anyhow!("{} engine requires a version", engine_label))?;
Some(fetch_entrypoint_params(engine_label, ver, html_path).await?)
}
Some(EngineKind::JsDos | EngineKind::Ruffle) => {
Some(EngineKind::JsDos | EngineKind::Ruffle | EngineKind::RenPy) => {
wavedash_config.executable_entrypoint_params()
}
None => None,
Expand Down
2 changes: 1 addition & 1 deletion src/file_staging.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ impl FileStaging {
}
}

// Validate executable and loader_url files exist (for JSDOS/Ruffle)
// Validate executable and loader_url files exist (for JSDOS/Ruffle/Ren'Py)
for file in wavedash_config.executable_files_to_validate() {
let file_path = upload_dir.join(file);
if !file_path.exists() {
Expand Down
Loading