pixi_outdated/
parser.rs

1use anyhow::Result;
2use serde::Deserialize;
3use std::collections::HashMap;
4use std::fs;
5use std::path::Path;
6
7#[derive(Debug, Deserialize)]
8pub struct PixiManifest {
9    pub project: ProjectMetadata,
10    #[serde(default)]
11    pub dependencies: HashMap<String, String>,
12    #[serde(rename = "pypi-dependencies", default)]
13    pub pypi_dependencies: HashMap<String, String>,
14}
15
16#[derive(Debug, Deserialize)]
17pub struct ProjectMetadata {
18    pub name: String,
19    pub channels: Vec<String>,
20    #[serde(default)]
21    pub platforms: Vec<String>,
22}
23
24#[derive(Debug, Deserialize)]
25pub struct PixiLock {
26    pub version: u32,
27    pub environments: HashMap<String, Environment>,
28    pub packages: Vec<LockedPackage>,
29}
30
31#[derive(Debug, Deserialize)]
32pub struct Environment {
33    pub channels: Vec<Channel>,
34    #[serde(default)]
35    pub indexes: Vec<String>,
36    pub packages: HashMap<String, Vec<PackageRef>>,
37}
38
39#[derive(Debug, Deserialize)]
40pub struct Channel {
41    pub url: String,
42}
43
44#[derive(Debug, Deserialize)]
45pub struct PackageRef {
46    #[serde(flatten)]
47    pub source: PackageSource,
48}
49
50#[derive(Debug, Deserialize)]
51#[serde(untagged)]
52pub enum PackageSource {
53    Conda { conda: String },
54    PyPI { pypi: String },
55}
56
57#[derive(Debug, Deserialize)]
58pub struct LockedPackage {
59    #[serde(flatten)]
60    pub source: PackageSource,
61    #[serde(default)]
62    pub name: Option<String>,
63    #[serde(default)]
64    pub version: Option<String>,
65}
66
67pub fn parse_manifest(path: &Path) -> Result<PixiManifest> {
68    let content = fs::read_to_string(path)?;
69    let manifest: PixiManifest = toml::from_str(&content)?;
70    Ok(manifest)
71}
72
73pub fn parse_lockfile(path: &Path) -> Result<PixiLock> {
74    let content = fs::read_to_string(path)?;
75    let lockfile: PixiLock = serde_yaml::from_str(&content)?;
76    Ok(lockfile)
77}