use rosc::OscMessage;
use uuid::Uuid;
use super::args::{parse_bool, parse_curve_id, parse_f32, parse_rgb, parse_string, parse_u16};
use crate::action::UiAction;
use crate::input::event::InputEvent;
use crate::storage::asset::palette::Palette;
use crate::storage::asset::project::scene_instance_path::SceneInstanceUnion;
use crate::storage::asset::scene::color::SceneInstanceColor;
use crate::storage::asset_id::AssetId;
pub(super) fn parse_target_input_action(
msg: &OscMessage,
target: SceneInstanceUnion,
input_kind: &str,
mode: &str,
) -> Result<UiAction, ()> {
let input = match mode {
"clear" => None,
"artnet" => Some(InputEvent::Artnet(parse_u16(msg, 0)?)),
_ => return Err(()),
};
match input_kind {
"activation_input" => Ok(UiAction::SetSceneActivationInput(target, input)),
"flash_input" => Ok(UiAction::SetSceneFlashInput(target, input)),
"dimmer_input" => Ok(UiAction::SetSceneDimmerInput(target, input)),
_ => Err(()),
}
}
pub(super) fn parse_target_action(
msg: &OscMessage,
target: SceneInstanceUnion,
action: &str,
) -> Result<UiAction, ()> {
match action {
"opacity" => Ok(UiAction::SetSceneOpacity(target, parse_f32(msg, 0)?)),
"active" => Ok(UiAction::SetSceneActive(target, parse_bool(msg, 0)?)),
"toggle" => Ok(UiAction::ToggleSceneActive(target)),
"select" => Ok(UiAction::SelectScene(target)),
"name" => Ok(UiAction::SetSceneName(target, parse_string(msg, 0)?)),
"color" => Ok(UiAction::SetSceneColor(target, parse_scene_color(msg, 0)?)),
"input_dimmer" => Ok(UiAction::SetSceneInputDimmer(target, parse_f32(msg, 0)?)),
"ignore_main_dimmer" => Ok(UiAction::SetSceneIgnoreMainDimmer(
target,
parse_bool(msg, 0)?,
)),
"beat_offset" => Ok(UiAction::SetSceneBeatOffset(target, parse_f32(msg, 0)?)),
"set_offset_on_flash" => Ok(UiAction::SetSceneSetOffsetOnFlash(
target,
parse_bool(msg, 0)?,
)),
"palette_overwrite" => Ok(UiAction::SetScenePaletteOverwriteFromAsset(
target,
parse_scene_palette_overwrite(msg, 0)?,
)),
"delete" => Ok(UiAction::DeleteSceneInstancePath(target)),
"clone" => Ok(UiAction::CloneSceneInstancePath(target)),
_ => Err(()),
}
}
pub(super) fn parse_target_palette_overwrite_action(
msg: &OscMessage,
target: SceneInstanceUnion,
action: &str,
) -> Result<UiAction, ()> {
match action {
"primary" => Ok(UiAction::SetScenePaletteOverwritePrimary(
target,
parse_rgb(msg)?,
)),
"secondary" => Ok(UiAction::SetScenePaletteOverwriteSecondary(
target,
parse_rgb(msg)?,
)),
_ => Err(()),
}
}
fn parse_scene_palette_overwrite(
msg: &OscMessage,
index: usize,
) -> Result<Option<Option<AssetId<Palette>>>, ()> {
let raw = parse_string(msg, index)?;
if raw.eq_ignore_ascii_case("inherit") {
return Ok(None);
}
if raw.eq_ignore_ascii_case("none") {
return Ok(Some(None));
}
let uuid = Uuid::parse_str(&raw).map_err(|_| ())?;
Ok(Some(Some(AssetId::from_uuid(uuid))))
}
pub(super) fn parse_target_curve_action(
msg: &OscMessage,
target: SceneInstanceUnion,
field: &str,
sub_action: &str,
) -> Result<UiAction, ()> {
match (field, sub_action) {
("opacity", "value") => Ok(UiAction::SetSceneOpacityMultiplier(
target,
parse_f32(msg, 0)?,
)),
("opacity", "static") => Ok(UiAction::SetSceneOpacity(target, parse_f32(msg, 0)?)),
("opacity", "curve") => Ok(UiAction::SetSceneOpacityCurve(
target,
parse_curve_id(msg, 0)?,
)),
("beat_offset", "value") => Ok(UiAction::SetSceneBeatOffsetMultiplier(
target,
parse_f32(msg, 0)?,
)),
("beat_offset", "static") => Ok(UiAction::SetSceneBeatOffset(target, parse_f32(msg, 0)?)),
("beat_offset", "curve") => Ok(UiAction::SetSceneBeatOffsetCurve(
target,
parse_curve_id(msg, 0)?,
)),
_ => Err(()),
}
}
fn parse_scene_color(msg: &OscMessage, index: usize) -> Result<SceneInstanceColor, ()> {
parse_string(msg, index)?.parse().map_err(|_| ())
}