assemble-core 0.2.0

The core crate of the assemble-rs package
Documentation
use assemble_core::dependencies::project_dependency::CreateProjectDependencies;
use assemble_core::error::PayloadError;
use assemble_core::flow::output::SinglePathOutputTask;

use assemble_core::identifier::TaskId;
use assemble_core::lazy_evaluation::{Prop, Provider};
use assemble_core::project::buildable::Buildable;
use assemble_core::project::error::ProjectError;
use assemble_core::task::initialize_task::InitializeTask;
use assemble_core::task::up_to_date::UpToDate;
use assemble_core::{BuildResult, Executable, Project, Task};
use assemble_macros::{CreateTask, TaskIO};

use std::collections::HashSet;
use std::path::PathBuf;
use std::str::FromStr;

#[derive(Debug, CreateTask, TaskIO)]
struct TestArtifactTask {
    output: Prop<PathBuf>,
}

impl UpToDate for TestArtifactTask {}
impl InitializeTask for TestArtifactTask {}

impl Task for TestArtifactTask {
    fn task_action(_task: &mut Executable<Self>, _project: &Project) -> BuildResult {
        todo!()
    }
}

impl SinglePathOutputTask for TestArtifactTask {
    fn get_path(task: &Executable<Self>) -> PathBuf {
        task.output.get()
    }
}

#[test]
fn inter_project_dependencies() -> Result<(), PayloadError<ProjectError>> {
    let project = Project::temp("sub-projects-test");
    project.with_mut(|p| -> Result<(), PayloadError<ProjectError>> {
        p.subproject("child1", |_sub| Ok(()))?;
        p.subproject("child2", |_sub| Ok(()))?;
        println!("children: {:?}", p.subprojects());
        Ok(())
    })?;

    let child1 = project.get_subproject("child1")?;
    println!("child1: {:#?}", child1);
    child1.with_mut(|p| -> Result<_, PayloadError<ProjectError>> {
        let mut task = p
            .task_container_mut()
            .register_task::<TestArtifactTask>("createFile")?;
        let file = p.file("testFile.txt")?.path().to_path_buf();
        let file_clone = file.clone();
        task.configure_with(|t, _p| {
            t.output.set(file_clone)?;
            Ok(())
        })?;
        p.variants_mut()
            .add_with("output", file, |c| c.built_by(task));
        Ok(())
    })?;

    let child2 = project.get_subproject("child2")?;
    println!("child2: {:#?}", child2);
    let config2 = child2.with_mut(|p| {
        let dep = p.project("::child1");
        p.configurations_mut()
            .create_with("input", |c| c.add_dependency(dep))
            .clone()
    });

    println!("config = {config2:#?}");
    let deps = child2.with(|p| config2.get_dependencies(p))?;
    println!("built by = {:#?}", deps);
    assert_eq!(
        deps,
        HashSet::from_iter([TaskId::from_str(":sub-projects-test:child1:createFile")?])
    );

    Ok(())
}