libsalmo/workflows/
status.rs1use std::collections::HashMap;
2
3use crate::{salmo_contex::SalmoContext, backend::MigrationStatus};
4
5pub struct TryStatus {
6 pub up_to_date: bool,
7 pub id: String
8}
9
10pub struct StatusSummary {
11 pub already_migrated: Vec<String>,
12 pub pending_migration: Vec<String>,
13 pub tries: Vec<TryStatus>,
14 pub untried: Vec<String>
15}
16
17
18pub struct CommittedStatus {
19 pub already_migrated: Vec<String>,
20 pub pending_migration: Vec<String>
21}
22
23pub fn get_status(context: SalmoContext) -> anyhow::Result<HashMap<String, StatusSummary>> {
24 let commits = context.commits()?;
25 let migrations_registry = context.migrations()?;
26 let all_migrations = migrations_registry.db.into_values().collect::<Vec<_>>();
27 context.environments.iter().map(|e| {
28 let mut backend = e.backend()?;
29 let s = backend.migration_status(&commits, all_migrations.as_slice())?;
30
31 let already_migrated = s.iter().filter_map(|m| match m.status {
32 MigrationStatus::Executed => Some(m.migration.id.clone()),
33 _ => None
34 }).collect();
35
36 let pending_migration = s.iter().filter_map(|m| match m.status {
37 MigrationStatus::Committed { tried: _ } => Some(m.migration.id.clone()),
38 _ => None
39 }).collect();
40
41 let untried = s.iter().filter_map(|m| match m.status {
42 MigrationStatus::Untried => Some(m.migration.id.clone()),
43 _ => None
44 }).collect();
45
46 let tries = s.iter().filter_map(|m| match m.status {
47 MigrationStatus::Tried { up_to_date } => Some(TryStatus { up_to_date, id: m.migration.id.clone() }),
48 _ => None
49 }).collect();
50
51
52 Ok((e.name.clone(), StatusSummary {
53 already_migrated,
54 pending_migration,
55 tries,
56 untried
57 }))
58 }).collect()
59}