Skip to main content

qubit_mime/detector/
file_command_mime_detector_provider.rs

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