documentation
This commit is contained in:
parent
6d32beedcc
commit
b5ef95b6ef
9 changed files with 62 additions and 28 deletions
|
@ -3,6 +3,9 @@
|
||||||
<option name="myName" value="Project Default" />
|
<option name="myName" value="Project Default" />
|
||||||
<inspection_tool class="DuplicatedCode" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
<inspection_tool class="DuplicatedCode" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
||||||
<inspection_tool class="RegExpRepeatedSpace" enabled="true" level="INFORMATION" enabled_by_default="true" />
|
<inspection_tool class="RegExpRepeatedSpace" enabled="true" level="INFORMATION" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="RsExperimentalChecks" enabled="true" level="ERROR" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="RsUnusedImport" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
||||||
|
<inspection_tool class="RsVariableMutable" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||||
<inspection_tool class="ShellCheck" enabled="true" level="ERROR" enabled_by_default="true">
|
<inspection_tool class="ShellCheck" enabled="true" level="ERROR" enabled_by_default="true">
|
||||||
<shellcheck_settings value="SC2016" />
|
<shellcheck_settings value="SC2016" />
|
||||||
</inspection_tool>
|
</inspection_tool>
|
||||||
|
|
|
@ -51,7 +51,7 @@ infer = { version = "0.5.0", optional = true }
|
||||||
|
|
||||||
[target.'cfg(not(all(target_endian = "big", target_pointer_width = "32")))'.dependencies]
|
[target.'cfg(not(all(target_endian = "big", target_pointer_width = "32")))'.dependencies]
|
||||||
# the seemingly weird target constraint here is due to this:
|
# the seemingly weird target constraint here is due to this:
|
||||||
# https://github.com/bodil/smartstring/blob/v0.2.7/src/config.rs#L102-L104
|
# https://github.com/bodil/smartstring/blob/v0.2.9/src/config.rs#L91-L93
|
||||||
# essentially, smartstring is intentionally blocked from compiling on 32-bit big endian archs, so our dependency on it
|
# essentially, smartstring is intentionally blocked from compiling on 32-bit big endian archs, so our dependency on it
|
||||||
# needs to be too. otherwise, fif won't work on platforms like powerpc, even though this dependency is the only
|
# needs to be too. otherwise, fif won't work on platforms like powerpc, even though this dependency is the only
|
||||||
# blocker -- fif runs just fine on powerpc without smartstring. or at least, just fine under qemu user-mode powerpc ~u0
|
# blocker -- fif runs just fine on powerpc without smartstring. or at least, just fine under qemu user-mode powerpc ~u0
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
//! The [`Findings`] and [`ScanError`] structs, used for conveying whether a given file was able to be scanned and
|
//! The [`Findings`] and [`ScanError`] structs, used for conveying whether a given file was able to be scanned, whether
|
||||||
//! whether its MIME type could be inferred.
|
//! its MIME type could be inferred, and whether the file should be renamed.
|
||||||
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
|
@ -15,7 +15,7 @@ use serde::{ser::SerializeStruct, Serializer};
|
||||||
use crate::files::mime_extension_lookup;
|
use crate::files::mime_extension_lookup;
|
||||||
use crate::String;
|
use crate::String;
|
||||||
|
|
||||||
/// Information about a scanned file.
|
/// Information about a successfully scanned file.
|
||||||
#[derive(Eq, PartialEq, Debug)]
|
#[derive(Eq, PartialEq, Debug)]
|
||||||
pub struct Findings {
|
pub struct Findings {
|
||||||
/// The location of the scanned file.
|
/// The location of the scanned file.
|
||||||
|
@ -72,6 +72,7 @@ impl serde::Serialize for Findings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Errors that can occur while scanning a file with [`scan_file`](crate::files::scan_file).
|
||||||
#[derive(Debug, PartialEq, PartialOrd, Ord, Eq)]
|
#[derive(Debug, PartialEq, PartialOrd, Ord, Eq)]
|
||||||
#[cfg_attr(feature = "json", derive(serde::Serialize))]
|
#[cfg_attr(feature = "json", derive(serde::Serialize))]
|
||||||
#[cfg_attr(feature = "json", serde(tag = "type", content = "path"))]
|
#[cfg_attr(feature = "json", serde(tag = "type", content = "path"))]
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
//! The various formats that [fif](crate) can output to.
|
//! Logic for handling the various output formats that fif can output to.
|
||||||
|
|
||||||
|
#![allow(missing_copy_implementations)]
|
||||||
|
|
||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
|
@ -17,7 +19,7 @@ use crate::utils::CLAP_LONG_VERSION;
|
||||||
use crate::Findings;
|
use crate::Findings;
|
||||||
use crate::String;
|
use crate::String;
|
||||||
|
|
||||||
/// A macro for creating an array of `Writable`s without needing to pepper your code with `into()`s.
|
/// A macro for creating an array of [`Writable`]s without needing to pepper your code with `into()`s.
|
||||||
/// # Usage
|
/// # Usage
|
||||||
/// ```
|
/// ```
|
||||||
/// use crate::fif::writables;
|
/// use crate::fif::writables;
|
||||||
|
@ -46,7 +48,7 @@ macro_rules! writables {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
/// Does the same thing as [writables], but adds a Newline to the end.
|
/// Does the same thing as [`writables`], but adds a Newline to the end.
|
||||||
macro_rules! writablesln {
|
macro_rules! writablesln {
|
||||||
[$($args:tt),+] => {
|
[$($args:tt),+] => {
|
||||||
&[$(writables!(@do $args),)* writables!(@do Newline)]
|
&[$(writables!(@do $args),)* writables!(@do Newline)]
|
||||||
|
|
27
src/lib.rs
27
src/lib.rs
|
@ -1,11 +1,15 @@
|
||||||
#![forbid(unsafe_code)]
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
//! This library consists of all of the things fif needs to run. It only exists as a library to separate code, and to
|
//! This library consists of all of the things fif needs to run. It only exists as a library to separate code, and to
|
||||||
//! make testing a bit easier. I don't recommend using this as a library for your crate, as it may have breaking
|
//! make documentation and testing a bit easier. I don't recommend using this as a library for your crate, as it may
|
||||||
//! changes without incrementing the major version, as it's really only meant to be a place for fif's internals to live.
|
//! have breaking changes without incrementing the major version - it's really only meant to be a place for fif's
|
||||||
|
//! internals to live.
|
||||||
|
//!
|
||||||
|
//! You can view [fif's README](https://gitlab.com/Lynnesbian/fif/-/blob/master/README.md#fif) to learn more.
|
||||||
|
|
||||||
|
#![forbid(unsafe_code)]
|
||||||
|
#![warn(trivial_casts, unused_lifetimes, unused_qualifications, missing_copy_implementations, unused_allocation)]
|
||||||
|
|
||||||
pub mod files;
|
pub mod files;
|
||||||
pub mod findings;
|
pub mod findings;
|
||||||
|
@ -22,20 +26,25 @@ use crate::mime_db::MimeDb;
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
if #[cfg(not(all(target_endian = "big", target_pointer_width = "32")))] {
|
if #[cfg(not(all(target_endian = "big", target_pointer_width = "32")))] {
|
||||||
// most architectures
|
/// On most architectures, this is a type alias for [`SmartString`](crate). However, on [architectures
|
||||||
|
/// unsupported by `smartstring`](https://github.com/bodil/smartstring/blob/v0.2.9/src/config.rs#L91-L93), this
|
||||||
|
/// is simply an alias to [`std::string::String`].
|
||||||
pub use smartstring::alias::String;
|
pub use smartstring::alias::String;
|
||||||
} else {
|
} else {
|
||||||
// powerpc and other big endian 32-bit archs
|
/// On most architectures, this is a type alias for [`SmartString`](crate). However, on [architectures
|
||||||
|
/// unsupported by `smartstring`](https://github.com/bodil/smartstring/blob/v0.2.9/src/config.rs#L91-L93), this
|
||||||
|
/// is simply an alias to [`std::string::String`].
|
||||||
|
// one particular arch that this needs to be turned off for is powerpc (the 32 bit variant that the pre-G5
|
||||||
|
// powerpc macs used)
|
||||||
pub use std::string::String;
|
pub use std::string::String;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
if #[cfg(any(all(unix, feature = "infer-backend"), all(not(unix), not(feature = "xdg-mime-backend"))))] {
|
if #[cfg(any(all(unix, feature = "infer-backend"), all(not(unix), not(feature = "xdg-mime-backend"))))] {
|
||||||
/// A [`Lazy`] holding an instance of [`mime_db::MimeDb`].
|
/// A [`Lazy`] holding an instance of [`mime_db::MimeDb`]. Initialised at program startup.
|
||||||
pub static MIMEDB: Lazy<mime_db::InferDb> = Lazy::new(crate::mime_db::InferDb::init);
|
pub static MIMEDB: Lazy<mime_db::InferDb> = Lazy::new(crate::mime_db::InferDb::init);
|
||||||
} else {
|
} else {
|
||||||
/// A [`Lazy`] holding an instance of [`mime_db::MimeDb`].
|
/// A [`Lazy`] holding an instance of [`mime_db::MimeDb`]. Initialised at program startup.
|
||||||
pub static MIMEDB: Lazy<mime_db::XdgDb> = Lazy::new(crate::mime_db::XdgDb::init);
|
pub static MIMEDB: Lazy<mime_db::XdgDb> = Lazy::new(crate::mime_db::XdgDb::init);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
// fif - a command-line tool for detecting and optionally correcting files with incorrect extensions.
|
// fif - a command-line tool for detecting and optionally correcting files with incorrect extensions.
|
||||||
|
|
||||||
#![forbid(unsafe_code)]
|
#![forbid(unsafe_code)]
|
||||||
#![warn(trivial_casts, unused_lifetimes, unused_qualifications)]
|
#![warn(trivial_casts, unused_lifetimes, unused_qualifications, missing_copy_implementations, unused_allocation)]
|
||||||
|
|
||||||
use std::io::{stdin, stdout, BufWriter, Write};
|
use std::io::{stdin, stdout, BufWriter, Write};
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
|
|
|
@ -1,11 +1,20 @@
|
||||||
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
//! Backend-neutral Mime database implementation.
|
//! Backend-neutral Mime database abstraction.
|
||||||
|
|
||||||
use cfg_if::cfg_if;
|
use cfg_if::cfg_if;
|
||||||
use mime::Mime;
|
use mime::Mime;
|
||||||
|
|
||||||
|
/// A thin wrapper around either [`Infer`] or [`xdg-mime::SharedMimeInfo`], depending on which [cargo features]
|
||||||
|
/// fif was compiled with. By default, fif uses an [`Infer`]-based implementation on Windows, and an
|
||||||
|
/// [`xdg-mime`]-based one everywhere else. This behaviour can be changed at compile time by using the aforementioned
|
||||||
|
/// [cargo features].
|
||||||
|
///
|
||||||
|
/// [cargo features]: https://gitlab.com/Lynnesbian/fif/-/wikis/Cargo-Features
|
||||||
|
/// [`Infer`]: https://docs.rs/infer/
|
||||||
|
/// [`xdg-mime::SharedMimeInfo`]: https://docs.rs/xdg-mime/0/xdg_mime/struct.SharedMimeInfo.html
|
||||||
|
/// [`xdg-mime`]: https://docs.rs/xdg-mime/
|
||||||
pub trait MimeDb {
|
pub trait MimeDb {
|
||||||
/// Initialise the database.
|
/// Initialise the database.
|
||||||
fn init() -> Self;
|
fn init() -> Self;
|
||||||
|
@ -17,6 +26,7 @@ cfg_if! {
|
||||||
if #[cfg(any(all(unix, feature = "infer-backend"), all(not(unix), not(feature = "xdg-mime-backend"))))] {
|
if #[cfg(any(all(unix, feature = "infer-backend"), all(not(unix), not(feature = "xdg-mime-backend"))))] {
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
/// The [`Infer`](https://docs.rs/infer/)-based implementation of [`MimeDb`].
|
||||||
pub struct InferDb {
|
pub struct InferDb {
|
||||||
db: infer::Infer,
|
db: infer::Infer,
|
||||||
}
|
}
|
||||||
|
@ -93,10 +103,11 @@ cfg_if! {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_type(&self, data: &[u8]) -> Option<Mime> {
|
fn get_type(&self, data: &[u8]) -> Option<Mime> {
|
||||||
self.db.get(data).map(|f| Mime::from_str(f.mime_type()).unwrap())
|
self.db.get(data).map(|f| Mime::from_str(f.mime_type())).ok()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/// The [`xdg-mime`](https://docs.rs/xdg-mime/)-based implementation of [`MimeDb`].
|
||||||
pub struct XdgDb {
|
pub struct XdgDb {
|
||||||
db: xdg_mime::SharedMimeInfo,
|
db: xdg_mime::SharedMimeInfo,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
// SPDX-FileCopyrightText: 2021 Lynnesbian
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
//! [Clap] struct used to parse command line arguments.
|
//! Command line argument parsing logic and associated functions.
|
||||||
|
|
||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
@ -14,13 +14,17 @@ use crate::String as StringType;
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
if #[cfg(windows)] {
|
if #[cfg(windows)] {
|
||||||
|
/// The default [`OutputFormat`] to use.
|
||||||
const DEFAULT_FORMAT: &str = "powershell";
|
const DEFAULT_FORMAT: &str = "powershell";
|
||||||
} else {
|
} else {
|
||||||
|
/// The default [`OutputFormat`] to use.
|
||||||
const DEFAULT_FORMAT: &str = "sh";
|
const DEFAULT_FORMAT: &str = "sh";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clap, PartialEq, Debug)]
|
#[derive(Clap, PartialEq, Debug, Copy, Clone)]
|
||||||
|
/// The format to use when running fif without the `--fix` flag. Specified at runtime with the `-o`/`--output-format`
|
||||||
|
/// flag.
|
||||||
pub enum OutputFormat {
|
pub enum OutputFormat {
|
||||||
/// A Bourne shell compatible script.
|
/// A Bourne shell compatible script.
|
||||||
#[clap(alias = "shell", alias = "bash")]
|
#[clap(alias = "shell", alias = "bash")]
|
||||||
|
@ -35,7 +39,9 @@ pub enum OutputFormat {
|
||||||
Json,
|
Json,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clap, PartialEq, Debug)]
|
#[derive(Clap, PartialEq, Debug, Copy, Clone)]
|
||||||
|
/// Specifies under what conditions the user should be prompted when running fif in `--fix` mode. Defaults to `Error`.
|
||||||
|
/// Specified at runtime with the `-p`/`--prompt` flag.
|
||||||
pub enum Prompt {
|
pub enum Prompt {
|
||||||
/// Never prompt.
|
/// Never prompt.
|
||||||
Never,
|
Never,
|
||||||
|
@ -60,6 +66,7 @@ pub enum Prompt {
|
||||||
setting(AppSettings::ColoredHelp),
|
setting(AppSettings::ColoredHelp),
|
||||||
max_term_width = 120
|
max_term_width = 120
|
||||||
)]
|
)]
|
||||||
|
/// [`Clap`]-derived struct used to parse command line arguments.
|
||||||
pub struct Parameters {
|
pub struct Parameters {
|
||||||
/// Automatically rename files to use the correct extension, prompting the user for every rename.
|
/// Automatically rename files to use the correct extension, prompting the user for every rename.
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
|
@ -71,7 +78,7 @@ pub struct Parameters {
|
||||||
|
|
||||||
/// Requires --fix. Allow overwriting files. Warning: When used in combination with `--prompt never`, fif will
|
/// Requires --fix. Allow overwriting files. Warning: When used in combination with `--prompt never`, fif will
|
||||||
/// overwrite files without prompting!
|
/// overwrite files without prompting!
|
||||||
#[clap(short = 'n', long, requires = "fix")]
|
#[clap(long, requires = "fix")]
|
||||||
pub overwrite: bool,
|
pub overwrite: bool,
|
||||||
|
|
||||||
// NOTE: clap's comma-separated argument parser makes it impossible to specify extensions with commas in their name -
|
// NOTE: clap's comma-separated argument parser makes it impossible to specify extensions with commas in their name -
|
||||||
|
@ -170,6 +177,7 @@ pub struct Parameters {
|
||||||
pub jobs: usize,
|
pub jobs: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Validation function for argument parsing that ensures passed-in extensions are lowercase.
|
||||||
fn lowercase_exts(exts: &str) -> Result<(), String> {
|
fn lowercase_exts(exts: &str) -> Result<(), String> {
|
||||||
// TODO: i would much rather accept uppercase exts and convert them to lowercase than just rejecting lowercase exts...
|
// TODO: i would much rather accept uppercase exts and convert them to lowercase than just rejecting lowercase exts...
|
||||||
if exts.to_lowercase() != exts {
|
if exts.to_lowercase() != exts {
|
||||||
|
@ -179,7 +187,7 @@ fn lowercase_exts(exts: &str) -> Result<(), String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Further options relating to scanning.
|
/// Further options relating to scanning.
|
||||||
#[derive(PartialEq, Debug)]
|
#[derive(PartialEq, Debug, Copy, Clone)]
|
||||||
#[allow(clippy::struct_excessive_bools)]
|
#[allow(clippy::struct_excessive_bools)]
|
||||||
pub struct ScanOpts {
|
pub struct ScanOpts {
|
||||||
/// Whether hidden files and directories should be scanned.
|
/// Whether hidden files and directories should be scanned.
|
||||||
|
@ -282,7 +290,7 @@ impl Parameters {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets of extensions for use with [Parameter](crate::parameters::Parameters)'s `-E` flag.
|
/// Sets of extensions for use with [Parameter](crate::parameters::Parameters)'s `-E` flag.
|
||||||
#[derive(Clap, PartialEq, Debug)]
|
#[derive(Clap, PartialEq, Debug, Copy, Clone)]
|
||||||
pub enum ExtensionSet {
|
pub enum ExtensionSet {
|
||||||
/// Extensions used for image file formats, such as `png`, `jpeg`, `webp`, etc.
|
/// Extensions used for image file formats, such as `png`, `jpeg`, `webp`, etc.
|
||||||
Images,
|
Images,
|
||||||
|
|
|
@ -21,11 +21,11 @@ cfg_if! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The version defined in Cargo.toml, prefixed with a v (e.g. "v0.3.1")
|
/// The version defined in Cargo.toml, prefixed with a v (e.g. "v0.4.0")
|
||||||
pub(crate) static CLAP_VERSION: Lazy<String> = Lazy::new(|| String::from("v") + VERSION.unwrap_or("???"));
|
pub(crate) static CLAP_VERSION: Lazy<String> = Lazy::new(|| String::from("v") + VERSION.unwrap_or("???"));
|
||||||
|
|
||||||
/// Similar to [`CLAP_VERSION`], followed by the chosen backend and abbreviated git commit hash in parentheses - For
|
/// The version defined in Cargo.toml, prefixed with a v (e.g. "v0.4.0"), followed by the chosen backend and
|
||||||
/// example, "v0.3.6 (XDG-Mime backend, commit #043e097)"
|
/// abbreviated git commit hash in parentheses - For example, "v0.4.0 (XDG-Mime backend, commit #043e097)"
|
||||||
pub static CLAP_LONG_VERSION: Lazy<String> = Lazy::new(|| {
|
pub static CLAP_LONG_VERSION: Lazy<String> = Lazy::new(|| {
|
||||||
format!(
|
format!(
|
||||||
"v{} ({} backend, commit #{})",
|
"v{} ({} backend, commit #{})",
|
||||||
|
|
Loading…
Reference in a new issue