Validate label names

This commit is contained in:
2026-02-21 13:53:30 -08:00
parent 70d9dfc173
commit 8ab4ea53ec
11 changed files with 318 additions and 63 deletions

View File

@@ -1,5 +1,5 @@
use jsonpath_rust::JsonPath;
use pile_config::{ConfigToml, DatasetFts};
use pile_config::{ConfigToml, DatasetFts, Label};
use serde_json::Value;
use std::{path::PathBuf, sync::LazyLock};
use tantivy::{
@@ -106,7 +106,7 @@ impl DbFtsIndex {
pub fn get_field(
&self,
json: &Value,
field_name: &str,
field_name: &Label,
) -> Result<Option<String>, std::io::Error> {
let field = match self.cfg.schema.get(field_name) {
Some(x) => x,
@@ -124,7 +124,7 @@ impl DbFtsIndex {
warn!(
message = "Path returned more than one value, this is not supported. Skipping.",
?path,
field = field_name
field = field_name.to_string()
);
continue;
}
@@ -139,7 +139,7 @@ impl DbFtsIndex {
warn!(
message = "Invalid path, skipping",
?path,
field = field_name,
field = field_name.to_string(),
?error
);
continue;
@@ -150,7 +150,7 @@ impl DbFtsIndex {
Value::Null => {
trace!(
message = "Skipping field, is null",
field = field_name,
field = field_name.to_string(),
path,
value = ?val
);
@@ -174,7 +174,7 @@ impl DbFtsIndex {
} else if x.len() > 1 {
debug!(
message = "Skipping field, is array with more than one element",
field = field_name,
field = field_name.to_string(),
path,
value = ?val
);
@@ -182,7 +182,7 @@ impl DbFtsIndex {
} else {
debug!(
message = "Skipping field, is empty array",
field = field_name,
field = field_name.to_string(),
path,
value = ?val
);
@@ -192,7 +192,7 @@ impl DbFtsIndex {
Value::Null => {
trace!(
message = "Skipping field, is null",
field = field_name,
field = field_name.to_string(),
path,
value = ?val
);
@@ -201,7 +201,7 @@ impl DbFtsIndex {
Value::Object(_) => {
trace!(
message = "Skipping field, is object",
field = field_name,
field = field_name.to_string(),
path,
value = ?val
);

View File

@@ -1,6 +1,9 @@
mod traits;
pub use traits::*;
mod misc;
pub use misc::*;
pub mod index;
pub mod item;
pub mod source;

View File

@@ -0,0 +1,61 @@
use chrono::{DateTime, Utc};
use std::fs;
use std::path::Path;
/// Returns the age of a path as a chrono DateTime.
/// - If the path doesn't exist, returns None
/// - If it's a file, returns the modified time
/// - If it's a directory, returns the LATEST modified time of all files within
pub fn path_age(path: impl AsRef<Path>) -> Option<DateTime<Utc>> {
let path = path.as_ref();
// Check if path exists
if !path.exists() {
return None;
}
let metadata = fs::metadata(path).ok()?;
if metadata.is_file() {
// For files, return the modified time
let modified = metadata.modified().ok()?;
Some(modified.into())
} else if metadata.is_dir() {
// For directories, find the latest modified time of all files
find_latest_modified(path)
} else {
None
}
}
fn find_latest_modified(dir: &Path) -> Option<DateTime<Utc>> {
let mut latest: Option<DateTime<Utc>> = None;
// Read directory entries
let entries = fs::read_dir(dir).ok()?;
for entry in entries.flatten() {
let path = entry.path();
let metadata = entry.metadata().ok()?;
if metadata.is_file() {
if let Ok(modified) = metadata.modified() {
let dt: DateTime<Utc> = modified.into();
latest = Some(match latest {
Some(prev) if prev > dt => prev,
_ => dt,
});
}
} else if metadata.is_dir() {
// Recursively check subdirectories
if let Some(dir_latest) = find_latest_modified(&path) {
latest = Some(match latest {
Some(prev) if prev > dir_latest => prev,
_ => dir_latest,
});
}
}
}
latest
}