Skip to main content

qubit_mime/detector/
file_command_mime_detector_provider.rs

1// =============================================================================
2//    Copyright (c) 2026 Haixing Hu.
3//
4//    SPDX-License-Identifier: Apache-2.0
5//
6//    Licensed under the Apache License, Version 2.0.
7// =============================================================================
8//! Provider for the built-in system `file` command MIME detector.
9
10use crate::{
11    FileCommandMimeDetector,
12    MimeConfig,
13    MimeDetector,
14    ProviderAvailability,
15    ProviderCreateError,
16    ProviderDescriptor,
17    ProviderRegistryError,
18    ServiceProvider,
19};
20
21use super::{
22    MimeDetectorAvailability,
23    MimeDetectorSpec,
24};
25
26/// Provider for the built-in system `file` command detector.
27#[derive(Debug, Clone, Copy, Default)]
28pub struct FileCommandMimeDetectorProvider;
29
30impl ServiceProvider<MimeDetectorSpec> for FileCommandMimeDetectorProvider {
31    /// Gets file command detector metadata.
32    fn descriptor(&self) -> Result<ProviderDescriptor, ProviderRegistryError> {
33        let descriptor = ProviderDescriptor::new("file")
34            .expect("built-in file detector provider id should be valid")
35            .with_aliases(&["file-command", "file-command-mime-detector"])
36            .expect("built-in file detector aliases should be valid")
37            .with_priority(10);
38        Ok(descriptor)
39    }
40
41    /// Checks whether the `file` command is available.
42    fn availability(&self, _config: &MimeConfig) -> MimeDetectorAvailability {
43        if FileCommandMimeDetector::is_available() {
44            ProviderAvailability::Available
45        } else {
46            ProviderAvailability::unavailable("`file` command is not available")
47        }
48    }
49
50    /// Creates a file-command-backed detector.
51    fn create_box(
52        &self,
53        config: &MimeConfig,
54    ) -> Result<Box<dyn MimeDetector>, ProviderCreateError> {
55        Ok(Box::new(FileCommandMimeDetector::from_mime_config(
56            config.clone(),
57        )))
58    }
59}