knave 0.12.5

A Lisp programming language for humans and agents that infers types and ownership and compiles to readable Rust
Documentation
use std::path::{Path, PathBuf};

use super::located_project::LocatedProject;
use super::terminal::{BuildRoute, BuildTarget, Terminal};
use crate::modules::SearchScope;

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TaskName(String);

impl TaskName {
    pub fn new(name: String) -> Self {
        Self(name)
    }

    pub fn as_str(&self) -> &str {
        &self.0
    }
}

pub struct ProjectTask<'p> {
    project: &'p LocatedProject,
    name: TaskName,
    binary: PathBuf,
    crate_name: String,
}

impl<'p> ProjectTask<'p> {
    const BIN_INFIX: &'static str = "task";

    pub fn new(project: &'p LocatedProject, name: TaskName) -> Self {
        let directory = Self::directory_of(project, &name);
        Self {
            project,
            binary: directory.join(name.as_str()),
            crate_name: Terminal::crate_name(Path::new(name.as_str())),
            name,
        }
    }

    fn directory_of(project: &LocatedProject, name: &TaskName) -> PathBuf {
        project
            .build_directory()
            .join(SearchScope::TASKS_DIRECTORY)
            .join(name.as_str())
    }

    pub fn name(&self) -> &TaskName {
        &self.name
    }

    pub fn build_directory(&self) -> PathBuf {
        Self::directory_of(self.project, &self.name)
    }

    pub fn binary(&self) -> &Path {
        &self.binary
    }

    pub fn root(&self) -> &Path {
        self.project.root()
    }

    pub fn route(&self) -> BuildRoute<'_> {
        if self.project.uses_crates() {
            let bin_stem = format!(
                "{}-{}-{}",
                self.project.name(),
                Self::BIN_INFIX,
                self.name.as_str()
            );
            return BuildRoute::Cargo {
                directory: self.build_directory(),
                target: self.project.cargo_target(&self.binary, &bin_stem),
            };
        }
        BuildRoute::Rustc(BuildTarget {
            directory: self.build_directory(),
            crate_name: &self.crate_name,
            output: &self.binary,
        })
    }
}