Generalize VFolder, implement Read & Write for VFile and improve docs
This commit is contained in:
parent
60458e6b2d
commit
a16f1ce105
|
@ -1,6 +1,10 @@
|
||||||
name: Cargo build & test
|
name: Cargo build & test
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- development
|
||||||
|
- 'releases/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
|
|
@ -8,6 +8,7 @@ use crate::util::{
|
||||||
ExtendableQueue,
|
ExtendableQueue,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Execute command with all its variants.
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
|
@ -369,6 +370,7 @@ fn combine_conditions_commands(
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Condition for the execute command.
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
|
|
|
@ -131,13 +131,17 @@ impl VFolder {
|
||||||
/// # Errors
|
/// # Errors
|
||||||
/// - If the folder cannot be written
|
/// - If the folder cannot be written
|
||||||
#[cfg(feature = "fs_access")]
|
#[cfg(feature = "fs_access")]
|
||||||
pub fn place(&self, path: &Path) -> std::io::Result<()> {
|
pub fn place<P>(&self, path: P) -> std::io::Result<()>
|
||||||
|
where
|
||||||
|
P: AsRef<Path>,
|
||||||
|
{
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
let path = path.as_ref();
|
||||||
|
|
||||||
fs::create_dir_all(path)?;
|
fs::create_dir_all(path)?;
|
||||||
// place each subfolder recursively
|
// place each subfolder recursively
|
||||||
for (name, folder) in &self.folders {
|
for (name, folder) in &self.folders {
|
||||||
folder.place(&path.join(name))?;
|
folder.place(path.join(name))?;
|
||||||
}
|
}
|
||||||
// create each file
|
// create each file
|
||||||
for (name, file) in &self.files {
|
for (name, file) in &self.files {
|
||||||
|
@ -158,7 +162,10 @@ impl VFolder {
|
||||||
/// # Errors
|
/// # Errors
|
||||||
/// - If the zip archive cannot be written
|
/// - If the zip archive cannot be written
|
||||||
#[cfg(all(feature = "fs_access", feature = "zip"))]
|
#[cfg(all(feature = "fs_access", feature = "zip"))]
|
||||||
pub fn zip(&self, path: &Path) -> std::io::Result<()> {
|
pub fn zip<P>(&self, path: P) -> std::io::Result<()>
|
||||||
|
where
|
||||||
|
P: AsRef<Path>,
|
||||||
|
{
|
||||||
use std::{fs, io::Write};
|
use std::{fs, io::Write};
|
||||||
|
|
||||||
// open target file
|
// open target file
|
||||||
|
@ -191,8 +198,9 @@ impl VFolder {
|
||||||
/// # Errors
|
/// # Errors
|
||||||
/// - If the zip archive cannot be written
|
/// - If the zip archive cannot be written
|
||||||
#[cfg(all(feature = "fs_access", feature = "zip"))]
|
#[cfg(all(feature = "fs_access", feature = "zip"))]
|
||||||
pub fn zip_with_comment<S>(&self, path: &Path, comment: S) -> std::io::Result<()>
|
pub fn zip_with_comment<P, S>(&self, path: P, comment: S) -> std::io::Result<()>
|
||||||
where
|
where
|
||||||
|
P: AsRef<Path>,
|
||||||
S: Into<String>,
|
S: Into<String>,
|
||||||
{
|
{
|
||||||
use std::{fs, io::Write};
|
use std::{fs, io::Write};
|
||||||
|
@ -315,6 +323,46 @@ pub enum VFile {
|
||||||
Binary(Vec<u8>),
|
Binary(Vec<u8>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl std::io::Read for VFile {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
|
||||||
|
self.as_bytes().read(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_to_string(&mut self, buf: &mut String) -> std::io::Result<usize> {
|
||||||
|
match self {
|
||||||
|
Self::Text(text) => {
|
||||||
|
buf.push_str(text);
|
||||||
|
Ok(text.len())
|
||||||
|
}
|
||||||
|
Self::Binary(data) => {
|
||||||
|
let text =
|
||||||
|
std::str::from_utf8(data).map_err(|_| std::io::ErrorKind::InvalidData)?;
|
||||||
|
buf.push_str(text);
|
||||||
|
Ok(text.len())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::io::Write for VFile {
|
||||||
|
fn flush(&mut self) -> std::io::Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
|
||||||
|
match self {
|
||||||
|
Self::Text(text) => {
|
||||||
|
text.push_str(&String::from_utf8_lossy(buf));
|
||||||
|
Ok(buf.len())
|
||||||
|
}
|
||||||
|
Self::Binary(data) => {
|
||||||
|
data.extend_from_slice(buf);
|
||||||
|
Ok(buf.len())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<String> for VFile {
|
impl From<String> for VFile {
|
||||||
fn from(value: String) -> Self {
|
fn from(value: String) -> Self {
|
||||||
Self::Text(value)
|
Self::Text(value)
|
||||||
|
|
Loading…
Reference in New Issue