diff options
author | tilpner | 2020-05-29 11:36:29 +0200 |
---|---|---|
committer | tilpner | 2020-05-29 11:36:29 +0200 |
commit | 23e93564ca7de185aacab4c494312d8b732922dd (patch) | |
tree | 1644046fe27dc48be07aa15a1d35a416eb95b6ba | |
parent | 32139f8f178a40e3aff155a5bc035157f2cfca42 (diff) | |
download | github-label-feed-23e93564ca7de185aacab4c494312d8b732922dd.tar.gz github-label-feed-23e93564ca7de185aacab4c494312d8b732922dd.tar.xz github-label-feed-23e93564ca7de185aacab4c494312d8b732922dd.zip |
atom: add option to only include open issues
-rw-r--r-- | src/atom.rs | 14 | ||||
-rw-r--r-- | src/main.rs | 8 | ||||
-rw-r--r-- | src/query/issues.rs | 39 |
3 files changed, 40 insertions, 21 deletions
diff --git a/src/atom.rs b/src/atom.rs index f7e96ec..2894ccb 100644 --- a/src/atom.rs +++ b/src/atom.rs @@ -44,18 +44,22 @@ fn entity_escape(from: &str) -> String { escaped } -async fn query_issues_for_label<'conn>(conn: &'conn mut Conn, repo_id: i64, label: &str) -> impl Stream<Item=sqlx::Result<Issue>> + 'conn { +async fn query_issues_for_label<'conn>(conn: &'conn mut Conn, + repo_id: i64, label: &str, only_open: bool) -> impl Stream<Item=sqlx::Result<Issue>> + 'conn { sqlx::query_as::<_, Issue>(r#" SELECT issues.number, state, title, body, user_login, html_url, updated_at FROM issues INNER JOIN is_labeled ON is_labeled.issue=issues.number WHERE is_labeled.label=(SELECT id FROM labels WHERE repo=? AND name=?) + AND (?=0 OR issues.state=?) ORDER BY issues.number DESC "#).bind(repo_id).bind(label) + .bind(only_open).bind(query::issues::IssueState::OPEN.to_integer()) .fetch(conn) } async fn issue_to_entry(conn: &mut Conn, repo_id: i64, issue: Issue) -> Result<Entry> { - let state_label = query::issues::integer_to_state_desc(issue.state); + let state_label = query::issues::IssueState::from_integer(issue.state) + .expect("Inconsistent database, invalid issue state").to_string(); let labels_of_issue = sqlx::query_as::<_, (String,)>( "SELECT labels.name FROM is_labeled JOIN labels ON is_labeled.label=labels.id @@ -102,7 +106,9 @@ async fn issue_to_entry(conn: &mut Conn, repo_id: i64, issue: Issue) -> Result<E .context("Failed to build atom entry")?) } -pub async fn generate(mut conn: &mut Conn, (ref owner, ref name): (String, String), out_path: PathBuf, labels: Vec<String>) -> Result<()> { +pub async fn generate(mut conn: &mut Conn, (ref owner, ref name): (String, String), + out_path: PathBuf, labels: Vec<String>, + only_open: bool) -> Result<()> { let labels = if labels.is_empty() { sqlx::query_as::<_, (String,)>( "SELECT name FROM labels WHERE repo=(SELECT id FROM repositories WHERE owner=? AND name=?)" @@ -142,7 +148,7 @@ pub async fn generate(mut conn: &mut Conn, (ref owner, ref name): (String, Strin .map_err(anyhow::Error::msg)? ]); - let issues: Vec<Issue> = query_issues_for_label(&mut conn, repo_id, &label).await + let issues: Vec<Issue> = query_issues_for_label(&mut conn, repo_id, &label, only_open).await .filter_map(|res| async { res.ok() }) .collect().await; diff --git a/src/main.rs b/src/main.rs index 196e587..e544da1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,7 +31,9 @@ enum OptMode { Atom { repo: String, out_path: PathBuf, - labels: Vec<String> + labels: Vec<String>, + #[structopt(long)] + only_open: bool } } @@ -127,9 +129,9 @@ fn main() -> Result<()> { tx.commit().await?; Ok(()) }, - OptMode::Atom { repo, out_path, labels } => { + OptMode::Atom { repo, out_path, labels, only_open } => { let repo = parse_repo(&repo)?; - atom::generate(&mut *pool.acquire().await?, repo, out_path, labels).await + atom::generate(&mut *pool.acquire().await?, repo, out_path, labels, only_open).await .context("Failed to generate Atom feed")?; Ok(()) } diff --git a/src/query/issues.rs b/src/query/issues.rs index b9473d3..525ebe5 100644 --- a/src/query/issues.rs +++ b/src/query/issues.rs @@ -21,23 +21,34 @@ type DateTime = String; )] pub struct IssuesQuery; -fn state_to_integer(state: issues_query::IssueState) -> i64 { - use issues_query::IssueState::*; - match state { - OPEN => 0, - CLOSED => 1, - Other(_) => 2 +pub use issues_query::IssueState; +impl IssueState { + pub fn from_integer(i: i64) -> Option<Self> { + match i { + 0 => Some(Self::OPEN), + 1 => Some(Self::CLOSED), + _ => None + } } -} -pub fn integer_to_state_desc(state: i64) -> Option<String> { - match state { - 0 => Some("open"), - 1 => Some("closed"), - _ => None - }.map(str::to_owned) + pub fn to_integer(&self) -> i64 { + match self { + Self::OPEN => 0, + Self::CLOSED => 1, + Self::Other(_) => 2 + } + } + + pub fn to_string(&self) -> Option<String> { + match self { + Self::OPEN => Some("open"), + Self::CLOSED => Some("closed"), + Self::Other(_) => None + }.map(str::to_owned) + } } + pub async fn update(mut conn: &mut Conn, github_api_token: &str, (ref owner, ref name): (String, String)) -> anyhow::Result<()> { let repo = repo_id(conn, owner, name).await?; @@ -90,7 +101,7 @@ pub async fn update(mut conn: &mut Conn, github_api_token: &str, (ref owner, ref "REPLACE INTO issues (repo, number, state, title, body, user_login, html_url, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" ).bind(repo).bind(issue.number) - .bind(state_to_integer(issue.state)).bind(issue.title).bind(issue.body_html) + .bind(issue.state.to_integer()).bind(issue.title).bind(issue.body_html) .bind(author).bind(issue.url).bind(ts) .execute(&mut conn) .await?; |