Skip to main content

provenant/parsers/
metadata.rs

1// SPDX-FileCopyrightText: Provenant contributors
2// SPDX-License-Identifier: Apache-2.0
3
4/// Registered detection-surface metadata for auto-generating documentation.
5///
6/// This module provides infrastructure for registering parser and scanner-gated
7/// detection surfaces
8/// that is used to automatically generate `docs/SUPPORTED_FORMATS.md`.
9///
10/// Fields are used by `bin/generate_supported_formats.rs` but not in library code,
11/// so we allow dead_code warnings for library builds.
12#[derive(Debug, Clone)]
13#[allow(dead_code)]
14pub struct ParserMetadata {
15    /// Human-readable description (e.g., "npm package.json manifest")
16    pub description: &'static str,
17    /// File patterns this parser matches (e.g., ["**/package.json"])
18    pub file_patterns: &'static [&'static str],
19    /// Package type identifier (e.g., "npm", "pypi", "maven")
20    pub package_type: &'static str,
21    /// Primary programming language (e.g., "JavaScript", "Python")
22    pub primary_language: &'static str,
23    /// Optional documentation URL
24    pub documentation_url: Option<&'static str>,
25}
26
27inventory::collect!(ParserMetadata);
28
29/// Registers parser metadata for documentation generation.
30///
31/// # Example
32///
33/// ```no_run
34/// use provenant::register_parser;
35///
36/// register_parser!(
37///     "npm package.json manifest",
38///     &["**/package.json"],
39///     "npm",
40///     "JavaScript",
41///     Some("https://docs.npmjs.com/cli/v10/configuring-npm/package-json"),
42/// );
43/// ```
44#[macro_export]
45macro_rules! register_parser {
46    ($description:expr, $patterns:expr, $package_type:expr, $language:expr, $docs_url:expr $(,)?) => {
47        inventory::submit! {
48            $crate::parsers::metadata::ParserMetadata {
49                description: $description,
50                file_patterns: $patterns,
51                package_type: $package_type,
52                primary_language: $language,
53                documentation_url: $docs_url,
54            }
55        }
56    };
57}
58
59/// Registers scanner-gated or detector-driven metadata for documentation generation.
60#[macro_export]
61macro_rules! register_detection_surface {
62    ($description:expr, $patterns:expr, $package_type:expr, $language:expr, $docs_url:expr $(,)?) => {
63        inventory::submit! {
64            $crate::parsers::metadata::ParserMetadata {
65                description: $description,
66                file_patterns: $patterns,
67                package_type: $package_type,
68                primary_language: $language,
69                documentation_url: $docs_url,
70            }
71        }
72    };
73}