golem-cli 1.3.1

Command line interface for Golem.
use anyhow::anyhow;
use indexmap::IndexMap;
use wit_encoder::{packages_from_parsed, Package};

pub struct EncodedWitDir {
    encoded_packages_by_parser_id: IndexMap<wit_parser::PackageId, Package>,
}

impl EncodedWitDir {
    pub fn new(resolve: &wit_parser::Resolve) -> anyhow::Result<Self> {
        let mut encoded_packages_by_parser_id = IndexMap::<wit_parser::PackageId, Package>::new();

        for package in packages_from_parsed(resolve) {
            let package_name = package.name();
            let package_name = wit_parser::PackageName {
                namespace: package_name.namespace().to_string(),
                name: package_name.name().to_string(),
                version: package_name.version().cloned(),
            };

            let package_id = resolve
                .package_names
                .get(&package_name)
                .cloned()
                .ok_or_else(|| anyhow!("Failed to get package by name: {}", package.name()))?;
            encoded_packages_by_parser_id.insert(package_id, package);
        }

        Ok(Self {
            encoded_packages_by_parser_id,
        })
    }

    pub fn package(&mut self, package_id: wit_parser::PackageId) -> anyhow::Result<&mut Package> {
        self.encoded_packages_by_parser_id
            .get_mut(&package_id)
            .ok_or_else(|| anyhow!("Failed to get encoded package by id: {:?}", package_id))
    }
}