mirror of
https://github.com/pcvolkmer/osc-variant.git
synced 2025-04-19 19:56:50 +00:00
refactor: reorganize features in file handling and errors
This commit is contained in:
parent
f858ecb9d4
commit
ee600436f9
@ -22,19 +22,13 @@
|
|||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use crate::file_io::InputFile::{Osc, Other};
|
|
||||||
use crate::model::onkostar_editor::OnkostarEditor;
|
|
||||||
use bytes::BytesMut;
|
|
||||||
use deob::deobfuscate;
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::fmt::{Debug, Display, Formatter};
|
use std::fmt::{Debug, Display, Formatter};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io::Read;
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
#[cfg(feature = "unzip-osb")]
|
use crate::model::onkostar_editor::OnkostarEditor;
|
||||||
use deob::deobfuscate;
|
|
||||||
|
|
||||||
pub enum FileError {
|
pub enum FileError {
|
||||||
Reading(String, String),
|
Reading(String, String),
|
||||||
@ -58,11 +52,18 @@ impl Display for FileError {
|
|||||||
match &self {
|
match &self {
|
||||||
FileError::Reading(filename, err) => format!("Kann Datei '{}' nicht lesen: {}", filename, err),
|
FileError::Reading(filename, err) => format!("Kann Datei '{}' nicht lesen: {}", filename, err),
|
||||||
FileError::Writing(filename, err) => format!("Kann Datei '{}' nicht schreiben: {}", filename, err),
|
FileError::Writing(filename, err) => format!("Kann Datei '{}' nicht schreiben: {}", filename, err),
|
||||||
|
#[cfg(feature = "unzip-osb")]
|
||||||
FileError::Parsing(filename, err) => format!(
|
FileError::Parsing(filename, err) => format!(
|
||||||
"Die Datei '{}' ist entweder keine OSB- oder OSC-Datei, fehlerhaft oder enthält zusätzliche Inhalte\n{}",
|
"Die Datei '{}' ist entweder keine OSB- oder OSC-Datei, fehlerhaft oder enthält zusätzliche Inhalte\n{}",
|
||||||
filename,
|
filename,
|
||||||
err
|
err
|
||||||
),
|
),
|
||||||
|
#[cfg(not(feature = "unzip-osb"))]
|
||||||
|
FileError::Parsing(filename, err) => format!(
|
||||||
|
"Die Datei '{}' ist keine OSC-Datei, fehlerhaft oder enthält zusätzliche Inhalte\n{}",
|
||||||
|
filename,
|
||||||
|
err
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -91,23 +92,27 @@ pub enum InputFile {
|
|||||||
impl InputFile {
|
impl InputFile {
|
||||||
pub fn filename(&self) -> String {
|
pub fn filename(&self) -> String {
|
||||||
match self {
|
match self {
|
||||||
Osc { filename, .. } => filename,
|
InputFile::Osc { filename, .. } => filename,
|
||||||
InputFile::Profile { filename, .. } => filename,
|
InputFile::Profile { filename, .. } => filename,
|
||||||
InputFile::Osb { filename, .. } => filename,
|
InputFile::Osb { filename, .. } => filename,
|
||||||
Other { filename, .. } => filename,
|
InputFile::Other { filename, .. } => filename,
|
||||||
}
|
}
|
||||||
.to_string()
|
.to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read(filename: String, password: Option<String>) -> Result<Self, FileError> {
|
pub fn read(filename: String, _password: Option<String>) -> Result<Self, FileError> {
|
||||||
if let Some(extension) = Path::new(filename.as_str()).extension() {
|
if let Some(extension) = Path::new(filename.as_str()).extension() {
|
||||||
return match extension.to_str() {
|
return match extension.to_str() {
|
||||||
Some("osc") => match fs::read_to_string(filename.clone()) {
|
Some("osc") => match fs::read_to_string(filename.clone()) {
|
||||||
Ok(content) => Ok(Osc { filename, content }),
|
Ok(content) => Ok(InputFile::Osc { filename, content }),
|
||||||
Err(err) => Err(FileError::Reading(filename, err.to_string())),
|
Err(err) => Err(FileError::Reading(filename, err.to_string())),
|
||||||
},
|
},
|
||||||
#[cfg(feature = "unzip-osb")]
|
#[cfg(feature = "unzip-osb")]
|
||||||
Some("osb") => {
|
Some("osb") => {
|
||||||
|
use bytes::BytesMut;
|
||||||
|
use deob::deobfuscate;
|
||||||
|
use std::io::Read;
|
||||||
|
|
||||||
let file = match fs::File::open(filename.clone()) {
|
let file = match fs::File::open(filename.clone()) {
|
||||||
Ok(file) => file,
|
Ok(file) => file,
|
||||||
Err(err) => return Err(FileError::Reading(filename, err.to_string())),
|
Err(err) => return Err(FileError::Reading(filename, err.to_string())),
|
||||||
@ -120,16 +125,7 @@ impl InputFile {
|
|||||||
|
|
||||||
let mut result = vec![];
|
let mut result = vec![];
|
||||||
|
|
||||||
let password = password.unwrap_or_else(|| {
|
let password = _password.unwrap_or_else(|| deobfuscate(env!("OSB_KEY").trim()));
|
||||||
#[cfg(feature = "unzip-osb")]
|
|
||||||
{
|
|
||||||
deobfuscate(env!("OSB_KEY").trim())
|
|
||||||
}
|
|
||||||
#[cfg(not(feature = "unzip-osb"))]
|
|
||||||
{
|
|
||||||
return Err(FileError::Reading(filename.clone(), "No Password".into()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
for i in 0..archive.len() {
|
for i in 0..archive.len() {
|
||||||
if let Ok(Ok(mut zip_file)) =
|
if let Ok(Ok(mut zip_file)) =
|
||||||
@ -138,14 +134,14 @@ impl InputFile {
|
|||||||
if zip_file.is_file() && zip_file.name().ends_with(".osc") {
|
if zip_file.is_file() && zip_file.name().ends_with(".osc") {
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
let _ = zip_file.read_to_string(&mut buf);
|
let _ = zip_file.read_to_string(&mut buf);
|
||||||
result.push(Osc {
|
result.push(InputFile::Osc {
|
||||||
filename: zip_file.name().to_string(),
|
filename: zip_file.name().to_string(),
|
||||||
content: buf,
|
content: buf,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
let mut buf = BytesMut::new();
|
let mut buf = BytesMut::new();
|
||||||
let _ = zip_file.read(&mut buf);
|
let _ = zip_file.read(&mut buf);
|
||||||
result.push(Other {
|
result.push(InputFile::Other {
|
||||||
filename: zip_file.name().to_string(),
|
filename: zip_file.name().to_string(),
|
||||||
content: buf.to_vec(),
|
content: buf.to_vec(),
|
||||||
})
|
})
|
||||||
@ -163,10 +159,16 @@ impl InputFile {
|
|||||||
content: result,
|
content: result,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "unzip-osb")]
|
||||||
_ => Err(FileError::Parsing(
|
_ => Err(FileError::Parsing(
|
||||||
filename,
|
filename,
|
||||||
"Nur OSB- oder OSC-Dateien werden unterstützt".to_string(),
|
"Nur OSB- oder OSC-Dateien werden unterstützt".to_string(),
|
||||||
)),
|
)),
|
||||||
|
#[cfg(not(feature = "unzip-osb"))]
|
||||||
|
_ => Err(FileError::Parsing(
|
||||||
|
filename,
|
||||||
|
"Nur OSC-Dateien werden unterstützt".to_string(),
|
||||||
|
)),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,7 +181,7 @@ impl TryFrom<InputFile> for OnkostarEditor {
|
|||||||
|
|
||||||
fn try_from(value: InputFile) -> Result<Self, Self::Error> {
|
fn try_from(value: InputFile) -> Result<Self, Self::Error> {
|
||||||
return match value {
|
return match value {
|
||||||
Osc {
|
InputFile::Osc {
|
||||||
filename, content, ..
|
filename, content, ..
|
||||||
} => match OnkostarEditor::from_str(content.as_str()) {
|
} => match OnkostarEditor::from_str(content.as_str()) {
|
||||||
Ok(data) => Ok(data),
|
Ok(data) => Ok(data),
|
||||||
@ -187,10 +189,9 @@ impl TryFrom<InputFile> for OnkostarEditor {
|
|||||||
},
|
},
|
||||||
InputFile::Osb { filename, .. }
|
InputFile::Osb { filename, .. }
|
||||||
| InputFile::Profile { filename, .. }
|
| InputFile::Profile { filename, .. }
|
||||||
| Other { filename, .. } => Err(FileError::Parsing(
|
| InputFile::Other { filename, .. } => {
|
||||||
filename,
|
Err(FileError::Parsing(filename, "Keine OSC-Datei".to_string()))
|
||||||
"Nur OSC-Dateien werden unterstützt".to_string(),
|
}
|
||||||
)),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user