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}