use crate::error::{RoxError, RoxResult};
use std::path::Path;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InputFormat {
#[cfg(feature = "compression")]
Rox,
Jrox,
Yrox,
Osu,
Taiko,
Sm,
Qua,
Fnf,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OutputFormat {
#[cfg(feature = "compression")]
Rox,
Jrox,
Yrox,
Osu,
Sm,
Qua,
Fnf,
}
impl InputFormat {
pub const EXTENSIONS: &'static [(&'static str, Self)] = &[
#[cfg(feature = "compression")]
("rox", Self::Rox),
("jrox", Self::Jrox),
("yrox", Self::Yrox),
("osu", Self::Osu),
("sm", Self::Sm),
("qua", Self::Qua),
("json", Self::Fnf),
];
pub fn from_extension(ext: &str) -> RoxResult<Self> {
let ext_lower = ext.to_lowercase();
for (e, format) in Self::EXTENSIONS {
if *e == ext_lower {
return Ok(*format);
}
}
Err(RoxError::UnsupportedFormat(format!(
"Unknown input extension: .{ext}"
)))
}
pub fn from_path(path: impl AsRef<Path>) -> RoxResult<Self> {
let path = path.as_ref();
let ext = path
.extension()
.and_then(|e| e.to_str())
.ok_or_else(|| RoxError::InvalidFormat("No file extension".into()))?;
Self::from_extension(ext)
}
}
impl OutputFormat {
pub const EXTENSIONS: &'static [(&'static str, Self)] = &[
#[cfg(feature = "compression")]
("rox", Self::Rox),
("jrox", Self::Jrox),
("yrox", Self::Yrox),
("osu", Self::Osu),
("sm", Self::Sm),
("qua", Self::Qua),
("json", Self::Fnf),
];
pub fn from_extension(ext: &str) -> RoxResult<Self> {
let ext_lower = ext.to_lowercase();
for (e, format) in Self::EXTENSIONS {
if *e == ext_lower {
return Ok(*format);
}
}
Err(RoxError::UnsupportedFormat(format!(
"Unknown output extension: .{ext}"
)))
}
pub fn from_path(path: impl AsRef<Path>) -> RoxResult<Self> {
let path = path.as_ref();
let ext = path
.extension()
.and_then(|e| e.to_str())
.ok_or_else(|| RoxError::InvalidFormat("No file extension".into()))?;
Self::from_extension(ext)
}
}