1mod parsers;
21mod scanner;
22
23use std::path::PathBuf;
24use thiserror::Error;
25
26pub use scanner::{scan, scan_streaming, scan_with_options, ScanOptions};
27
28#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
30#[serde(rename_all = "lowercase")]
31pub enum RunnerType {
32 Npm,
33 Bun,
34 Yarn,
35 Pnpm,
36 Make,
37 Cargo,
38 Flutter,
39 Dart,
40 Turbo,
41 Poetry,
42 Pdm,
43 Just,
44 Deno,
45 Maven,
46 DotNet,
47}
48
49impl RunnerType {
50 pub fn display_name(&self) -> &'static str {
52 match self {
53 RunnerType::Npm => "npm",
54 RunnerType::Bun => "bun",
55 RunnerType::Yarn => "yarn",
56 RunnerType::Pnpm => "pnpm",
57 RunnerType::Make => "make",
58 RunnerType::Cargo => "cargo",
59 RunnerType::Flutter => "flutter",
60 RunnerType::Dart => "dart",
61 RunnerType::Turbo => "turbo",
62 RunnerType::Poetry => "poetry",
63 RunnerType::Pdm => "pdm",
64 RunnerType::Just => "just",
65 RunnerType::Deno => "deno",
66 RunnerType::Maven => "mvn",
67 RunnerType::DotNet => "dotnet",
68 }
69 }
70
71 pub fn icon(&self) -> &'static str {
73 match self {
74 RunnerType::Npm => "๐ฆ",
75 RunnerType::Bun => "๐ฅ",
76 RunnerType::Yarn => "๐งถ",
77 RunnerType::Pnpm => "๐ฆ",
78 RunnerType::Make => "๐จ",
79 RunnerType::Cargo => "๐ฆ",
80 RunnerType::Flutter => "๐",
81 RunnerType::Dart => "๐ฏ",
82 RunnerType::Turbo => "โก",
83 RunnerType::Poetry => "๐",
84 RunnerType::Pdm => "๐",
85 RunnerType::Just => "๐",
86 RunnerType::Deno => "๐ฆ",
87 RunnerType::Maven => "๐ชถ",
88 RunnerType::DotNet => "๐ฃ",
89 }
90 }
91
92 pub fn color_code(&self) -> u8 {
94 match self {
95 RunnerType::Npm => 1, RunnerType::Bun => 3, RunnerType::Yarn => 4, RunnerType::Pnpm => 3, RunnerType::Make => 2, RunnerType::Cargo => 1, RunnerType::Flutter => 6, RunnerType::Dart => 6, RunnerType::Turbo => 5, RunnerType::Poetry => 2, RunnerType::Pdm => 2, RunnerType::Just => 3, RunnerType::Deno => 2, RunnerType::Maven => 1, RunnerType::DotNet => 5, }
111 }
112}
113
114impl std::fmt::Display for RunnerType {
115 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
116 write!(f, "{}", self.display_name())
117 }
118}
119
120#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
122pub struct Task {
123 pub name: String,
125 pub command: String,
127 #[serde(skip_serializing_if = "Option::is_none")]
129 pub description: Option<String>,
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub script: Option<String>,
133}
134
135#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
137pub struct TaskRunner {
138 pub config_path: PathBuf,
140 pub runner_type: RunnerType,
142 pub tasks: Vec<Task>,
144}
145
146#[derive(Error, Debug)]
148pub enum ScanError {
149 #[error("IO error: {0}")]
150 Io(#[from] std::io::Error),
151
152 #[error("Failed to parse {path}: {message}")]
153 ParseError { path: PathBuf, message: String },
154
155 #[error("Walk error: {0}")]
156 WalkError(#[from] ignore::Error),
157}
158
159pub type ScanResult<T> = Result<T, ScanError>;