Skip to main content

agentshield/ir/
dependency_surface.rs

1use serde::{Deserialize, Serialize};
2use std::path::PathBuf;
3
4use super::SourceLocation;
5
6/// Dependency information extracted from lockfiles and manifests.
7#[derive(Debug, Clone, Default, Serialize, Deserialize)]
8pub struct DependencySurface {
9    /// Parsed dependencies.
10    pub dependencies: Vec<Dependency>,
11    /// Lockfile information.
12    pub lockfile: Option<LockfileInfo>,
13    /// Issues found in dependency analysis.
14    pub issues: Vec<DependencyIssue>,
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct Dependency {
19    pub name: String,
20    pub version_constraint: Option<String>,
21    pub locked_version: Option<String>,
22    pub locked_hash: Option<String>,
23    /// "pypi", "npm", etc.
24    pub registry: String,
25    pub is_dev: bool,
26    pub location: Option<SourceLocation>,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct LockfileInfo {
31    pub path: PathBuf,
32    pub format: LockfileFormat,
33    pub all_pinned: bool,
34    pub all_hashed: bool,
35}
36
37#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
38#[serde(rename_all = "snake_case")]
39pub enum LockfileFormat {
40    PipRequirements,
41    PipenvLock,
42    PoetryLock,
43    UvLock,
44    NpmLock,
45    PnpmLock,
46    YarnLock,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct DependencyIssue {
51    pub issue_type: DependencyIssueType,
52    pub package_name: String,
53    pub description: String,
54}
55
56#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
57#[serde(rename_all = "snake_case")]
58pub enum DependencyIssueType {
59    Unpinned,
60    NoHash,
61    PossibleTyposquat,
62    NoLockfile,
63}