smbcloud_deploy/
runner.rs1use crate::{error::DeployError, report::Reporter};
4use smbcloud_model::runner::Runner;
5use smbcloud_utils::config::Config;
6use std::{env::current_dir, path::Path};
7
8pub fn detect_runner(config: &Config, reporter: &dyn Reporter) -> Result<Runner, DeployError> {
16 reporter.step_start("Checking runner");
17
18 if config.project.runner == Runner::Monorepo && config.projects.is_some() {
21 reporter.step_done("Monorepo universal runner");
22 return Ok(Runner::Monorepo);
23 }
24
25 let path = current_dir().map_err(|_| {
26 reporter.step_fail("Could not read the current directory.");
27 DeployError::RunnerNotDetected
28 })?;
29
30 let runner = Runner::from(&path).map_err(|_| {
31 reporter.step_fail("Could not detect a runner.");
32 DeployError::RunnerNotDetected
33 })?;
34
35 reporter.step_done(label_for(runner));
36 Ok(runner)
37}
38
39fn label_for(runner: Runner) -> &'static str {
41 match runner {
42 Runner::Monorepo => "Monorepo universal runner",
43 Runner::NodeJs => "Node.js runner detected",
44 Runner::Static => "Static site, no build step required",
45 Runner::Ruby if Path::new("Gemfile").exists() => "Ruby runner with Rails app detected",
46 Runner::Swift if Path::new("Package.swift").exists() => {
47 "Swift runner with Vapor app detected"
48 }
49 Runner::Rust if Path::new("Cargo.toml").exists() => {
50 "Rust runner with Cargo project detected"
51 }
52 _ => "Runner detected",
53 }
54}