use anyhow::{Result, anyhow};
use git2::Repository;
use log::error;
use serde::Deserialize;
use serde::Serialize;
use crate::status::Status;
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct SubmoduleView {
pub name: String,
pub status: Status,
}
impl SubmoduleView {
pub fn list(repo: &Repository) -> Result<Vec<Self>> {
let mut submodules = Vec::new();
for submodule in repo.submodules()? {
match submodule.open() {
Ok(subrepo) => {
let (status, _, _) = Status::find(&subrepo)?;
let name = submodule
.name()
.ok_or(anyhow!("submodule name is invalid UTF-8"))?;
submodules.push(Self {
name: name.to_string(),
status,
});
}
Err(e) => error!("could not open submodule as repository: {e}"),
}
}
Ok(submodules)
}
}