Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions lychee-lib/src/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ use crate::InputSource;
use crate::filter::PathExcludes;
use crate::types::resolver::UrlContentResolver;
use crate::{
Base, Input, Request, Result, basic_auth::BasicAuthExtractor, extract::Extractor,
types::FileExtensions, types::uri::raw::RawUri, utils::request,
Base, Input, InputResolver, Request, Result, basic_auth::BasicAuthExtractor,
extract::Extractor, types::FileExtensions, types::uri::raw::RawUri, utils::request,
};
use dashmap::DashSet;
use futures::TryStreamExt;
Expand Down Expand Up @@ -188,7 +188,8 @@ impl Collector {
let excluded_paths = excluded_paths.clone();
let file_extensions = file_extensions.clone();
async move {
let input_sources = input.get_input_sources(
let input_sources = InputResolver::resolve(
&input,
file_extensions,
skip_hidden,
skip_ignored,
Expand Down
6 changes: 3 additions & 3 deletions lychee-lib/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ pub use crate::{
filter::{Excludes, Filter, Includes},
types::{
AcceptRange, AcceptRangeError, Base, BasicAuthCredentials, BasicAuthSelector, CacheStatus,
CookieJar, ErrorKind, FileExtensions, FileType, Input, InputContent, InputSource, Request,
Response, ResponseBody, Result, Status, StatusCodeExcluder, StatusCodeSelector,
uri::valid::Uri,
CookieJar, ErrorKind, FileExtensions, FileType, Input, InputContent, InputResolver,
InputSource, Request, Response, ResponseBody, Result, Status, StatusCodeExcluder,
StatusCodeSelector, uri::valid::Uri,
},
};
58 changes: 58 additions & 0 deletions lychee-lib/src/types/input/content.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
//! Input content representation and construction.
//!
//! The `InputContent` type represents the actual content extracted from various
//! input sources, along with metadata about the source and file type.

use super::source::InputSource;
use crate::ErrorKind;
use crate::types::FileType;
use std::fs;
use std::path::PathBuf;

/// Encapsulates the content for a given input
#[derive(Debug)]
pub struct InputContent {
/// Input source
pub source: InputSource,
/// File type of given input
pub file_type: FileType,
/// Raw UTF-8 string content
pub content: String,
}

impl InputContent {
#[must_use]
/// Create an instance of `InputContent` from an input string
pub fn from_string(s: &str, file_type: FileType) -> Self {
// TODO: consider using Cow (to avoid one .clone() for String types)
Self {
source: InputSource::String(s.to_owned()),
file_type,
content: s.to_owned(),
}
}
}

impl TryFrom<&PathBuf> for InputContent {
type Error = crate::ErrorKind;

fn try_from(path: &PathBuf) -> std::result::Result<Self, Self::Error> {
let input = match fs::read_to_string(path) {
Ok(content) => content,
Err(e) if e.kind() == std::io::ErrorKind::InvalidData => {
log::warn!(
"Skipping file with invalid UTF-8 content: {}",
path.display()
);
return Err(ErrorKind::ReadFileInput(e, path.clone()));
}
Err(e) => return Err(ErrorKind::ReadFileInput(e, path.clone())),
};

Ok(Self {
source: InputSource::String(input.clone()),
file_type: FileType::from(path),
content: input,
})
}
}
Loading
Loading