1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
use octocrab::models::*; use reqwest::Url; use serde::*; use crate::*; #[derive(Serialize, Debug)] pub struct LabelRec { pub id: i64, pub node_id: String, pub url: Url, pub name: String, pub description: Option<String>, pub color: String, pub default: bool, pub sdc_repository: String, } impl RepositryAware for LabelRec { fn set_repository(&mut self, name: String) { self.sdc_repository = name; } } impl From<Label> for LabelRec { fn from(from: Label) -> Self { Self { id: from.id, node_id: from.node_id, url: from.url, name: from.name, description: from.description, color: from.color, default: from.default, sdc_repository: String::default(), } } } pub struct LabelFetcher { owner: String, name: String, octocrab: octocrab::Octocrab, } impl LabelFetcher { pub fn new(owner: String, name: String, octocrab: octocrab::Octocrab) -> Self { Self { owner, name, octocrab, } } } impl UrlConstructor for LabelFetcher { fn reponame(&self) -> String { format!("{}/{}", self.owner, self.name) } fn entrypoint(&self) -> Option<Url> { let param = Params::default(); let route = format!( "repos/{owner}/{repo}/labels?{query}", owner = &self.owner, repo = &self.name, query = param.to_query(), ); self.octocrab.absolute_url(route).ok() } } impl LoopWriter for LabelFetcher { type Model = Label; type Record = LabelRec; } impl LabelFetcher { pub async fn fetch<T: std::io::Write>(&self, mut wtr: csv::Writer<T>) -> octocrab::Result<()> { let mut next: Option<Url> = self.entrypoint(); while let Some(page) = self.octocrab.get_page(&next).await? { next = self.write_and_continue(page, &mut wtr); } Ok(()) } }