[INFO] cloning repository https://github.com/BigBuildBench/cncf_gitvote
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/BigBuildBench/cncf_gitvote" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FBigBuildBench%2Fcncf_gitvote", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FBigBuildBench%2Fcncf_gitvote'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] afe7ce9de337cb7033df8e2f1f237a60bbda873e
[INFO] checking BigBuildBench/cncf_gitvote against try#5fee451ebd94296ea05214e819c311e164b30af6 for pr-139042
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FBigBuildBench%2Fcncf_gitvote" "/workspace/builds/worker-2-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-2-tc2/source'...
[INFO] [stderr] done.
[INFO] validating manifest of git repo https://github.com/BigBuildBench/cncf_gitvote on toolchain 5fee451ebd94296ea05214e819c311e164b30af6
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+5fee451ebd94296ea05214e819c311e164b30af6" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] started tweaking git repo https://github.com/BigBuildBench/cncf_gitvote
[INFO] finished tweaking git repo https://github.com/BigBuildBench/cncf_gitvote
[INFO] tweaked toml for git repo https://github.com/BigBuildBench/cncf_gitvote written to /workspace/builds/worker-2-tc2/source/Cargo.toml
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+5fee451ebd94296ea05214e819c311e164b30af6" "generate-lockfile" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] [stderr]      Locking 40 packages to latest compatible versions
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+5fee451ebd94296ea05214e819c311e164b30af6" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:4b26683ee3c49f365255c425c23003cbf4366de097804722c29c5bbbee3624d2" "/opt/rustwide/cargo-home/bin/cargo" "+5fee451ebd94296ea05214e819c311e164b30af6" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] 4126981c28e5936198a8506148eb90fe9ab36dbe6dc1f48d04d587c105f1c6a7
[INFO] running `Command { std: "docker" "start" "-a" "4126981c28e5936198a8506148eb90fe9ab36dbe6dc1f48d04d587c105f1c6a7", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "4126981c28e5936198a8506148eb90fe9ab36dbe6dc1f48d04d587c105f1c6a7", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "4126981c28e5936198a8506148eb90fe9ab36dbe6dc1f48d04d587c105f1c6a7", kill_on_drop: false }`
[INFO] [stdout] 4126981c28e5936198a8506148eb90fe9ab36dbe6dc1f48d04d587c105f1c6a7
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:4b26683ee3c49f365255c425c23003cbf4366de097804722c29c5bbbee3624d2" "/opt/rustwide/cargo-home/bin/cargo" "+5fee451ebd94296ea05214e819c311e164b30af6" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 80b634ff5c4a20deeb036f221ad448490c87404f0c03c1455c36a68d61c78fa4
[INFO] running `Command { std: "docker" "start" "-a" "80b634ff5c4a20deeb036f221ad448490c87404f0c03c1455c36a68d61c78fa4", kill_on_drop: false }`
[INFO] [stderr]    Compiling proc-macro2 v1.0.94
[INFO] [stderr]    Compiling unicode-ident v1.0.18
[INFO] [stderr]     Checking itoa v1.0.15
[INFO] [stderr]     Checking bytes v1.10.1
[INFO] [stderr]     Checking predicates-core v1.0.9
[INFO] [stderr]    Compiling mockall_derive v0.13.1
[INFO] [stderr]     Checking termtree v0.5.1
[INFO] [stderr]     Checking pin-project-lite v0.2.16
[INFO] [stderr]     Checking anstyle v1.0.10
[INFO] [stderr]     Checking downcast v0.11.0
[INFO] [stderr]     Checking fragile v2.0.1
[INFO] [stderr]     Checking gitvote v1.3.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Checking tokio v1.44.1
[INFO] [stdout] error[E0432]: unresolved import `anyhow`
[INFO] [stdout]   --> src/main.rs:12:5
[INFO] [stdout]    |
[INFO] [stdout] 12 | use anyhow::{Context, Result};
[INFO] [stdout]    |     ^^^^^^ use of unresolved module or unlinked crate `anyhow`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `anyhow`, use `cargo add anyhow` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `clap`
[INFO] [stdout]   --> src/main.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 13 | use clap::Parser;
[INFO] [stdout]    |     ^^^^ use of unresolved module or unlinked crate `clap`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `clap`, use `cargo add clap` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `config`
[INFO] [stdout]   --> src/main.rs:14:5
[INFO] [stdout]    |
[INFO] [stdout] 14 | use config::{Config, File};
[INFO] [stdout]    |     ^^^^^^ use of unresolved module or unlinked crate `config`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `config`, use `cargo add config` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `deadpool_postgres`
[INFO] [stdout]   --> src/main.rs:15:5
[INFO] [stdout]    |
[INFO] [stdout] 15 | use deadpool_postgres::{Config as DbConfig, Runtime};
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `deadpool_postgres`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `deadpool_postgres`, use `cargo add deadpool_postgres` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `openssl`
[INFO] [stdout]   --> src/main.rs:17:5
[INFO] [stdout]    |
[INFO] [stdout] 17 | use openssl::ssl::{SslConnector, SslMethod, SslVerifyMode};
[INFO] [stdout]    |     ^^^^^^^ use of unresolved module or unlinked crate `openssl`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `openssl`, use `cargo add openssl` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `octocrab`
[INFO] [stdout]   --> src/main.rs:16:5
[INFO] [stdout]    |
[INFO] [stdout] 16 | use octocrab::Octocrab;
[INFO] [stdout]    |     ^^^^^^^^ use of unresolved module or unlinked crate `octocrab`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `octocrab`, use `cargo add octocrab` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]   --> src/main.rs:20:5
[INFO] [stdout]    |
[INFO] [stdout] 20 | use tokio::{net::TcpListener, signal, sync::broadcast};
[INFO] [stdout]    |     ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tokio`, use `cargo add tokio` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `postgres_openssl`
[INFO] [stdout]   --> src/main.rs:18:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | use postgres_openssl::MakeTlsConnector;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `postgres_openssl`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `postgres_openssl`, use `cargo add postgres_openssl` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `tokio`
[INFO] [stdout]   --> src/main.rs:20:5
[INFO] [stdout]    |
[INFO] [stdout] 20 | use tokio::{net::TcpListener, signal, sync::broadcast};
[INFO] [stdout]    |     ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tokio`, use `cargo add tokio` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `tracing`
[INFO] [stdout]   --> src/main.rs:21:5
[INFO] [stdout]    |
[INFO] [stdout] 21 | use tracing::{debug, info};
[INFO] [stdout]    |     ^^^^^^^ use of unresolved module or unlinked crate `tracing`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tracing`, use `cargo add tracing` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `tracing_subscriber`
[INFO] [stdout]   --> src/main.rs:22:5
[INFO] [stdout]    |
[INFO] [stdout] 22 | use tracing_subscriber::EnvFilter;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `tracing_subscriber`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tracing_subscriber`, use `cargo add tracing_subscriber` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `ignore`
[INFO] [stdout]  --> src/cfg.rs:3:5
[INFO] [stdout]   |
[INFO] [stdout] 3 | use ignore::gitignore::GitignoreBuilder;
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `ignore`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `ignore`, use `cargo add ignore` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `anyhow`
[INFO] [stdout]  --> src/cfg.rs:2:5
[INFO] [stdout]   |
[INFO] [stdout] 2 | use anyhow::{bail, Result};
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `anyhow`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `anyhow`, use `cargo add anyhow` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `serde`
[INFO] [stdout]  --> src/cfg.rs:4:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | use serde::{Deserialize, Serialize};
[INFO] [stdout]   |     ^^^^^ use of unresolved module or unlinked crate `serde`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `serde`, use `cargo add serde` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `thiserror`
[INFO] [stdout]  --> src/cfg.rs:6:5
[INFO] [stdout]   |
[INFO] [stdout] 6 | use thiserror::Error;
[INFO] [stdout]   |     ^^^^^^^^^ use of unresolved module or unlinked crate `thiserror`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `thiserror`, use `cargo add thiserror` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `anyhow`
[INFO] [stdout]  --> src/cmd.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use anyhow::Result;
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `anyhow`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `anyhow`, use `cargo add anyhow` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `lazy_static`
[INFO] [stdout]  --> src/cmd.rs:6:5
[INFO] [stdout]   |
[INFO] [stdout] 6 | use lazy_static::lazy_static;
[INFO] [stdout]   |     ^^^^^^^^^^^ use of unresolved module or unlinked crate `lazy_static`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `lazy_static`, use `cargo add lazy_static` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `regex`
[INFO] [stdout]  --> src/cmd.rs:7:5
[INFO] [stdout]   |
[INFO] [stdout] 7 | use regex::Regex;
[INFO] [stdout]   |     ^^^^^ use of unresolved module or unlinked crate `regex`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `regex`, use `cargo add regex` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `serde`
[INFO] [stdout]  --> src/cmd.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use serde::{Deserialize, Serialize};
[INFO] [stdout]   |     ^^^^^ use of unresolved module or unlinked crate `serde`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `serde`, use `cargo add serde` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `tracing`
[INFO] [stdout]  --> src/cmd.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tracing::error;
[INFO] [stdout]   |     ^^^^^^^ use of unresolved module or unlinked crate `tracing`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `tracing`, use `cargo add tracing` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `anyhow`
[INFO] [stdout]  --> src/db.rs:7:5
[INFO] [stdout]   |
[INFO] [stdout] 7 | use anyhow::Result;
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `anyhow`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `anyhow`, use `cargo add anyhow` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `async_trait`
[INFO] [stdout]  --> src/db.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use async_trait::async_trait;
[INFO] [stdout]   |     ^^^^^^^^^^^ use of unresolved module or unlinked crate `async_trait`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `async_trait`, use `cargo add async_trait` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio_postgres`
[INFO] [stdout]   --> src/db.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 13 | use tokio_postgres::types::Json;
[INFO] [stdout]    |     ^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `tokio_postgres`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tokio_postgres`, use `cargo add tokio_postgres` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `deadpool_postgres`
[INFO] [stdout]  --> src/db.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use deadpool_postgres::{Pool, Transaction};
[INFO] [stdout]   |     ^^^^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `deadpool_postgres`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `deadpool_postgres`, use `cargo add deadpool_postgres` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `uuid`
[INFO] [stdout]   --> src/db.rs:14:5
[INFO] [stdout]    |
[INFO] [stdout] 14 | use uuid::Uuid;
[INFO] [stdout]    |     ^^^^ use of unresolved module or unlinked crate `uuid`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `uuid`, use `cargo add uuid` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `anyhow`
[INFO] [stdout]  --> src/github.rs:2:5
[INFO] [stdout]   |
[INFO] [stdout] 2 | use anyhow::{bail, Context, Error, Result};
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `anyhow`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `anyhow`, use `cargo add anyhow` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `axum`
[INFO] [stdout]  --> src/github.rs:4:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | use axum::http::HeaderValue;
[INFO] [stdout]   |     ^^^^ use of unresolved module or unlinked crate `axum`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `axum`, use `cargo add axum` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `async_trait`
[INFO] [stdout]  --> src/github.rs:3:5
[INFO] [stdout]   |
[INFO] [stdout] 3 | use async_trait::async_trait;
[INFO] [stdout]   |     ^^^^^^^^^^^ use of unresolved module or unlinked crate `async_trait`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `async_trait`, use `cargo add async_trait` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `graphql_client`
[INFO] [stdout]  --> src/github.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use graphql_client::GraphQLQuery;
[INFO] [stdout]   |     ^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `graphql_client`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `graphql_client`, use `cargo add graphql_client` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `octocrab`
[INFO] [stdout]  --> src/github.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use octocrab::{models::InstallationId, Octocrab, Page};
[INFO] [stdout]   |     ^^^^^^^^ use of unresolved module or unlinked crate `octocrab`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `octocrab`, use `cargo add octocrab` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `http`
[INFO] [stdout]  --> src/github.rs:6:5
[INFO] [stdout]   |
[INFO] [stdout] 6 | use http::StatusCode;
[INFO] [stdout]   |     ^^^^ use of unresolved module or unlinked crate `http`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `http`, use `cargo add http` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `octocrab`
[INFO] [stdout]  --> src/github.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use octocrab::{models::InstallationId, Octocrab, Page};
[INFO] [stdout]   |     ^^^^^^^^ use of unresolved module or unlinked crate `octocrab`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `octocrab`, use `cargo add octocrab` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `serde`
[INFO] [stdout]   --> src/github.rs:10:5
[INFO] [stdout]    |
[INFO] [stdout] 10 | use serde::{Deserialize, Serialize};
[INFO] [stdout]    |     ^^^^^ use of unresolved module or unlinked crate `serde`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `serde`, use `cargo add serde` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `serde_json`
[INFO] [stdout]   --> src/github.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | use serde_json::{json, Value};
[INFO] [stdout]    |     ^^^^^^^^^^ use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `serde_json`, use `cargo add serde_json` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `thiserror`
[INFO] [stdout]   --> src/github.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 13 | use thiserror::Error;
[INFO] [stdout]    |     ^^^^^^^^^ use of unresolved module or unlinked crate `thiserror`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `thiserror`, use `cargo add thiserror` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `axum`
[INFO] [stdout]  --> src/handlers.rs:3:5
[INFO] [stdout]   |
[INFO] [stdout] 3 | use axum::{
[INFO] [stdout]   |     ^^^^ use of unresolved module or unlinked crate `axum`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `axum`, use `cargo add axum` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `anyhow`
[INFO] [stdout]  --> src/handlers.rs:2:5
[INFO] [stdout]   |
[INFO] [stdout] 2 | use anyhow::{format_err, Error, Result};
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `anyhow`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `anyhow`, use `cargo add anyhow` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `axum`
[INFO] [stdout]  --> src/handlers.rs:3:5
[INFO] [stdout]   |
[INFO] [stdout] 3 | use axum::{
[INFO] [stdout]   |     ^^^^ use of unresolved module or unlinked crate `axum`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `axum`, use `cargo add axum` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `config`
[INFO] [stdout]   --> src/handlers.rs:11:5
[INFO] [stdout]    |
[INFO] [stdout] 11 | use config::{Config, ConfigError};
[INFO] [stdout]    |     ^^^^^^ use of unresolved module or unlinked crate `config`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `config`, use `cargo add config` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `hmac`
[INFO] [stdout]   --> src/handlers.rs:12:5
[INFO] [stdout]    |
[INFO] [stdout] 12 | use hmac::{Hmac, Mac};
[INFO] [stdout]    |     ^^^^ use of unresolved module or unlinked crate `hmac`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `hmac`, use `cargo add hmac` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `sha2`
[INFO] [stdout]   --> src/handlers.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 13 | use sha2::Sha256;
[INFO] [stdout]    |     ^^^^ use of unresolved module or unlinked crate `sha2`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `sha2`, use `cargo add sha2` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tower_http`
[INFO] [stdout]   --> src/handlers.rs:16:5
[INFO] [stdout]    |
[INFO] [stdout] 16 | use tower_http::trace::TraceLayer;
[INFO] [stdout]    |     ^^^^^^^^^^ use of unresolved module or unlinked crate `tower_http`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tower_http`, use `cargo add tower_http` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `tower`
[INFO] [stdout]   --> src/handlers.rs:15:5
[INFO] [stdout]    |
[INFO] [stdout] 15 | use tower::ServiceBuilder;
[INFO] [stdout]    |     ^^^^^ use of unresolved module or unlinked crate `tower`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tower`, use `cargo add tower` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `tracing`
[INFO] [stdout]   --> src/handlers.rs:17:5
[INFO] [stdout]    |
[INFO] [stdout] 17 | use tracing::{error, instrument, trace};
[INFO] [stdout]    |     ^^^^^^^ use of unresolved module or unlinked crate `tracing`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tracing`, use `cargo add tracing` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `anyhow`
[INFO] [stdout]  --> src/processor.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use anyhow::Result;
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `anyhow`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `anyhow`, use `cargo add anyhow` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `askama`
[INFO] [stdout]  --> src/processor.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use askama::Template;
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `askama`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `askama`, use `cargo add askama` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `futures`
[INFO] [stdout]   --> src/processor.rs:10:5
[INFO] [stdout]    |
[INFO] [stdout] 10 | use futures::future::{self, JoinAll};
[INFO] [stdout]    |     ^^^^^^^ use of unresolved module or unlinked crate `futures`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `futures`, use `cargo add futures` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `futures`
[INFO] [stdout]   --> src/processor.rs:10:5
[INFO] [stdout]    |
[INFO] [stdout] 10 | use futures::future::{self, JoinAll};
[INFO] [stdout]    |     ^^^^^^^ use of unresolved module or unlinked crate `futures`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `futures`, use `cargo add futures` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]   --> src/processor.rs:13:5
[INFO] [stdout]    |
[INFO] [stdout] 13 | use tokio::{
[INFO] [stdout]    |     ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tokio`, use `cargo add tokio` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `time`
[INFO] [stdout]   --> src/processor.rs:12:5
[INFO] [stdout]    |
[INFO] [stdout] 12 | use time::OffsetDateTime;
[INFO] [stdout]    |     ^^^^ help: a similar path exists: `std::time`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `tracing`
[INFO] [stdout]   --> src/processor.rs:18:5
[INFO] [stdout]    |
[INFO] [stdout] 18 | use tracing::{debug, error, instrument, warn};
[INFO] [stdout]    |     ^^^^^^^ use of unresolved module or unlinked crate `tracing`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tracing`, use `cargo add tracing` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `uuid`
[INFO] [stdout]   --> src/processor.rs:19:5
[INFO] [stdout]    |
[INFO] [stdout] 19 | use uuid::Uuid;
[INFO] [stdout]    |     ^^^^ use of unresolved module or unlinked crate `uuid`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `uuid`, use `cargo add uuid` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `anyhow`
[INFO] [stdout]  --> src/results.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use anyhow::{bail, Result};
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `anyhow`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `anyhow`, use `cargo add anyhow` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `time`
[INFO] [stdout]  --> src/results.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use time::{format_description::well_known::Rfc3339, OffsetDateTime};
[INFO] [stdout]   |     ^^^^ use of unresolved module or unlinked crate `time`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `time`, use `cargo add time` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `serde`
[INFO] [stdout]  --> src/results.rs:6:5
[INFO] [stdout]   |
[INFO] [stdout] 6 | use serde::{Deserialize, Serialize};
[INFO] [stdout]   |     ^^^^^ use of unresolved module or unlinked crate `serde`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `serde`, use `cargo add serde` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio_postgres`
[INFO] [stdout]  --> src/results.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tokio_postgres::{types::Json, Row};
[INFO] [stdout]   |     ^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `tokio_postgres`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `tokio_postgres`, use `cargo add tokio_postgres` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `time`
[INFO] [stdout]  --> src/results.rs:8:5
[INFO] [stdout]   |
[INFO] [stdout] 8 | use time::{format_description::well_known::Rfc3339, OffsetDateTime};
[INFO] [stdout]   |     ^^^^ help: a similar path exists: `std::time`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `tokio_postgres`
[INFO] [stdout]  --> src/results.rs:9:5
[INFO] [stdout]   |
[INFO] [stdout] 9 | use tokio_postgres::{types::Json, Row};
[INFO] [stdout]   |     ^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `tokio_postgres`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `tokio_postgres`, use `cargo add tokio_postgres` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `uuid`
[INFO] [stdout]   --> src/results.rs:10:5
[INFO] [stdout]    |
[INFO] [stdout] 10 | use uuid::Uuid;
[INFO] [stdout]    |     ^^^^ use of unresolved module or unlinked crate `uuid`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `uuid`, use `cargo add uuid` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0432]: unresolved import `askama`
[INFO] [stdout]  --> src/tmpl.rs:7:5
[INFO] [stdout]   |
[INFO] [stdout] 7 | use askama::Template;
[INFO] [stdout]   |     ^^^^^^ use of unresolved module or unlinked crate `askama`
[INFO] [stdout]   |
[INFO] [stdout]   = help: if you wanted to use a crate named `askama`, use `cargo add askama` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout]    --> src/github.rs:390:23
[INFO] [stdout]     |
[INFO] [stdout] 390 |                 Some(&serde_json::json!({
[INFO] [stdout]     |                       ^^^^^^^^^^ use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:105:17
[INFO] [stdout]     |
[INFO] [stdout] 105 |                 tokio::select! {
[INFO] [stdout]     |                 ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:143:33
[INFO] [stdout]     |
[INFO] [stdout] 143 |                     Ok(None) => tokio::select! {
[INFO] [stdout]     |                                 ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:152:25
[INFO] [stdout]     |
[INFO] [stdout] 152 |                         tokio::select! {
[INFO] [stdout]     |                         ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:190:17
[INFO] [stdout]     |
[INFO] [stdout] 190 |                 tokio::select! {
[INFO] [stdout]     |                 ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:231:17
[INFO] [stdout]     |
[INFO] [stdout] 231 |                 tokio::select! {
[INFO] [stdout]     |                 ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]   --> src/main.rs:43:3
[INFO] [stdout]    |
[INFO] [stdout] 43 | #[tokio::main]
[INFO] [stdout]    |   ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/main.rs:124:5
[INFO] [stdout]     |
[INFO] [stdout] 124 |     tokio::select! {
[INFO] [stdout]     |     ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]   --> src/cfg.rs:21:7
[INFO] [stdout]    |
[INFO] [stdout] 21 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]    |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]   --> src/cfg.rs:76:7
[INFO] [stdout]    |
[INFO] [stdout] 76 |     #[serde(with = "humantime_serde")]
[INFO] [stdout]    |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]   --> src/cfg.rs:79:7
[INFO] [stdout]    |
[INFO] [stdout] 79 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]    |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]   --> src/cfg.rs:81:7
[INFO] [stdout]    |
[INFO] [stdout] 81 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]    |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]   --> src/cfg.rs:83:7
[INFO] [stdout]    |
[INFO] [stdout] 83 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]    |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]   --> src/cfg.rs:85:7
[INFO] [stdout]    |
[INFO] [stdout] 85 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]    |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/cfg.rs:132:7
[INFO] [stdout]     |
[INFO] [stdout] 132 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/cfg.rs:134:7
[INFO] [stdout]     |
[INFO] [stdout] 134 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/cfg.rs:136:7
[INFO] [stdout]     |
[INFO] [stdout] 136 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/cfg.rs:143:7
[INFO] [stdout]     |
[INFO] [stdout] 143 |     #[serde(skip_serializing_if = "Option::is_none")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Checking predicates-tree v1.0.12
[INFO] [stderr]     Checking predicates v3.1.3
[INFO] [stdout] error: cannot find attribute `error` in this scope
[INFO] [stdout]    --> src/cfg.rs:156:7
[INFO] [stdout]     |
[INFO] [stdout] 156 |     #[error("config not found")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `error` in this scope
[INFO] [stdout]    --> src/cfg.rs:158:7
[INFO] [stdout]     |
[INFO] [stdout] 158 |     #[error("invalid config: {0}")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `error` in this scope
[INFO] [stdout]    --> src/cfg.rs:160:7
[INFO] [stdout]     |
[INFO] [stdout] 160 |     #[error("profile not found")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `graphql` in this scope
[INFO] [stdout]   --> src/github.rs:41:3
[INFO] [stdout]    |
[INFO] [stdout] 41 | #[graphql(
[INFO] [stdout]    |   ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `graphql` in this scope
[INFO] [stdout]   --> src/github.rs:50:3
[INFO] [stdout]    |
[INFO] [stdout] 50 | #[graphql(
[INFO] [stdout]    |   ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `error` in this scope
[INFO] [stdout]    --> src/github.rs:494:7
[INFO] [stdout]     |
[INFO] [stdout] 494 |     #[error("event header missing")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `error` in this scope
[INFO] [stdout]    --> src/github.rs:496:7
[INFO] [stdout]     |
[INFO] [stdout] 496 |     #[error("unsupported event")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `error` in this scope
[INFO] [stdout]    --> src/github.rs:498:7
[INFO] [stdout]     |
[INFO] [stdout] 498 |     #[error("invalid body: {0}")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/github.rs:513:3
[INFO] [stdout]     |
[INFO] [stdout] 513 | #[serde(rename_all = "lowercase")]
[INFO] [stdout]     |   ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/github.rs:516:7
[INFO] [stdout]     |
[INFO] [stdout] 516 |     #[serde(other)]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/github.rs:532:3
[INFO] [stdout]     |
[INFO] [stdout] 532 | #[serde(rename_all = "lowercase")]
[INFO] [stdout]     |   ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/github.rs:535:7
[INFO] [stdout]     |
[INFO] [stdout] 535 |     #[serde(other)]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/github.rs:550:3
[INFO] [stdout]     |
[INFO] [stdout] 550 | #[serde(rename_all = "snake_case")]
[INFO] [stdout]     |   ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/github.rs:554:7
[INFO] [stdout]     |
[INFO] [stdout] 554 |     #[serde(other)]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `serde` in this scope
[INFO] [stdout]    --> src/github.rs:604:7
[INFO] [stdout]     |
[INFO] [stdout] 604 |     #[serde(rename = "ref")]
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:11:3
[INFO] [stdout]    |
[INFO] [stdout] 11 | #[template(path = "config-not-found.md")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:16:3
[INFO] [stdout]    |
[INFO] [stdout] 16 | #[template(path = "config-profile-not-found.md")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:21:3
[INFO] [stdout]    |
[INFO] [stdout] 21 | #[template(path = "index.html")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:26:3
[INFO] [stdout]    |
[INFO] [stdout] 26 | #[template(path = "invalid-config.md")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:40:3
[INFO] [stdout]    |
[INFO] [stdout] 40 | #[template(path = "no-vote-in-progress.md")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:58:3
[INFO] [stdout]    |
[INFO] [stdout] 58 | #[template(path = "vote-cancelled.md")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:76:3
[INFO] [stdout]    |
[INFO] [stdout] 76 | #[template(path = "vote-checked-recently.md")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:81:3
[INFO] [stdout]    |
[INFO] [stdout] 81 | #[template(path = "vote-closed.md")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]   --> src/tmpl.rs:95:3
[INFO] [stdout]    |
[INFO] [stdout] 95 | #[template(path = "vote-closed-announcement.md")]
[INFO] [stdout]    |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]    --> src/tmpl.rs:115:3
[INFO] [stdout]     |
[INFO] [stdout] 115 | #[template(path = "vote-created.md")]
[INFO] [stdout]     |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]    --> src/tmpl.rs:162:3
[INFO] [stdout]     |
[INFO] [stdout] 162 | #[template(path = "vote-in-progress.md")]
[INFO] [stdout]     |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]    --> src/tmpl.rs:180:3
[INFO] [stdout]     |
[INFO] [stdout] 180 | #[template(path = "vote-restricted.md")]
[INFO] [stdout]     |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `template` in this scope
[INFO] [stdout]    --> src/tmpl.rs:194:3
[INFO] [stdout]     |
[INFO] [stdout] 194 | #[template(path = "vote-status.md")]
[INFO] [stdout]     |   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `clap` in this scope
[INFO] [stdout]   --> src/main.rs:36:3
[INFO] [stdout]    |
[INFO] [stdout] 36 | #[clap(author, version, about)]
[INFO] [stdout]    |   ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: cannot find attribute `clap` in this scope
[INFO] [stdout]   --> src/main.rs:39:7
[INFO] [stdout]    |
[INFO] [stdout] 39 |     #[clap(short, long)]
[INFO] [stdout]    |       ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tracing`
[INFO] [stdout]    --> src/processor.rs:369:9
[INFO] [stdout]     |
[INFO] [stdout] 369 |         tracing::Span::current().record("vote_id", vote.vote_id.to_string());
[INFO] [stdout]     |         ^^^^^^^ use of unresolved module or unlinked crate `tracing`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `tracing`, use `cargo add tracing` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tracing`
[INFO] [stdout]    --> src/processor.rs:406:9
[INFO] [stdout]     |
[INFO] [stdout] 406 |         tracing::Span::current().record("vote_id", vote.vote_id.to_string());
[INFO] [stdout]     |         ^^^^^^^ use of unresolved module or unlinked crate `tracing`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `tracing`, use `cargo add tracing` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `jsonwebtoken`
[INFO] [stdout]   --> src/main.rs:77:27
[INFO] [stdout]    |
[INFO] [stdout] 77 |     let app_private_key = jsonwebtoken::EncodingKey::from_rsa_pem(app_private_key.as_bytes())?;
[INFO] [stdout]    |                           ^^^^^^^^^^^^ use of unresolved module or unlinked crate `jsonwebtoken`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `jsonwebtoken`, use `cargo add jsonwebtoken` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0425]: cannot find value `CMD` in this scope
[INFO] [stdout]   --> src/cmd.rs:74:37
[INFO] [stdout]    |
[INFO] [stdout] 74 |             if let Some(captures) = CMD.captures(content) {
[INFO] [stdout]    |                                     ^^^ not found in this scope
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `octocrab`
[INFO] [stdout]    --> src/github.rs:650:17
[INFO] [stdout]     |
[INFO] [stdout] 650 |     if let Some(octocrab::Error::GitHub { source, backtrace: _ }) = err.downcast_ref::<octocrab::Error>() {
[INFO] [stdout]     |                 ^^^^^^^^ use of unresolved module or unlinked crate `octocrab`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `octocrab`, use `cargo add octocrab` to add it to your `Cargo.toml`
[INFO] [stdout] help: consider importing one of these items
[INFO] [stdout]     |
[INFO] [stdout] 1   + use std::error::Error;
[INFO] [stdout]     |
[INFO] [stdout] 1   + use std::fmt::Error;
[INFO] [stdout]     |
[INFO] [stdout] 1   + use std::io::Error;
[INFO] [stdout]     |
[INFO] [stdout] 1   + use core::error::Error;
[INFO] [stdout]     |
[INFO] [stdout]       and 1 other candidate
[INFO] [stdout] help: if you import `Error`, refer to it directly
[INFO] [stdout]     |
[INFO] [stdout] 650 -     if let Some(octocrab::Error::GitHub { source, backtrace: _ }) = err.downcast_ref::<octocrab::Error>() {
[INFO] [stdout] 650 +     if let Some(Error::GitHub { source, backtrace: _ }) = err.downcast_ref::<octocrab::Error>() {
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no function or associated item named `parse` found for struct `Args` in the current scope
[INFO] [stdout]   --> src/main.rs:45:22
[INFO] [stdout]    |
[INFO] [stdout] 37 | struct Args {
[INFO] [stdout]    | ----------- function or associated item `parse` not found for this struct
[INFO] [stdout] ...
[INFO] [stdout] 45 |     let args = Args::parse();
[INFO] [stdout]    |                      ^^^^^ function or associated item not found in `Args`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tracing_subscriber`
[INFO] [stdout]   --> src/main.rs:60:13
[INFO] [stdout]    |
[INFO] [stdout] 60 |     let s = tracing_subscriber::fmt().with_env_filter(EnvFilter::from_default_env());
[INFO] [stdout]    |             ^^^^^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `tracing_subscriber`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `tracing_subscriber`, use `cargo add tracing_subscriber` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]   --> src/main.rs:82:30
[INFO] [stdout]    |
[INFO] [stdout] 82 |     let (cmds_tx, cmds_rx) = async_channel::unbounded();
[INFO] [stdout]    |                              ^^^^^^^^^^^^^ use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `async_channel`, use `cargo add async_channel` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]   --> src/main.rs:84:53
[INFO] [stdout]    |
[INFO] [stdout] 84 |     let votes_processor = processor::Processor::new(db.clone(), gh.clone());
[INFO] [stdout]    |                                                     ^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]    |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]   --> src/db.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub(crate) trait DB {
[INFO] [stdout]    |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23 |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24 |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]    |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27 |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30 |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33 |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36 |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39 |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42 |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45 |     async fn store_vote(
[INFO] [stdout]    |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53 |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56 |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]    = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]    = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]    = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]    = help: consider moving `has_vote` to another trait
[INFO] [stdout]    = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]    = help: consider moving `store_vote` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]    = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/main.rs:84:65
[INFO] [stdout]     |
[INFO] [stdout] 84  |     let votes_processor = processor::Processor::new(db.clone(), gh.clone());
[INFO] [stdout]     |                                                                 ^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]   --> src/main.rs:84:53
[INFO] [stdout]    |
[INFO] [stdout] 84 |     let votes_processor = processor::Processor::new(db.clone(), gh.clone());
[INFO] [stdout]    |                                                     ^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]    |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]   --> src/db.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub(crate) trait DB {
[INFO] [stdout]    |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23 |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24 |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]    |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27 |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30 |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33 |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36 |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39 |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42 |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45 |     async fn store_vote(
[INFO] [stdout]    |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53 |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56 |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]    = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]    = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]    = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]    = help: consider moving `has_vote` to another trait
[INFO] [stdout]    = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]    = help: consider moving `store_vote` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]    = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout]    = note: required for the cast from `Arc<PgDB>` to `Arc<(dyn DB + Send + Sync + 'static)>`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/main.rs:84:65
[INFO] [stdout]     |
[INFO] [stdout] 84  |     let votes_processor = processor::Processor::new(db.clone(), gh.clone());
[INFO] [stdout]     |                                                                 ^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout]     = note: required for the cast from `Arc<GHApi>` to `Arc<(dyn github::GH + Send + Sync + 'static)>`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]   --> src/main.rs:89:47
[INFO] [stdout]    |
[INFO] [stdout] 89 |     let router = handlers::setup_router(&cfg, db, gh, cmds_tx)?;
[INFO] [stdout]    |                                               ^^ `DB` is not dyn compatible
[INFO] [stdout]    |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]   --> src/db.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub(crate) trait DB {
[INFO] [stdout]    |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23 |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24 |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]    |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27 |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30 |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33 |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36 |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39 |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42 |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45 |     async fn store_vote(
[INFO] [stdout]    |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53 |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56 |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]    = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]    = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]    = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]    = help: consider moving `has_vote` to another trait
[INFO] [stdout]    = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]    = help: consider moving `store_vote` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]    = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout]    = note: required for the cast from `Arc<PgDB>` to `Arc<(dyn DB + Send + Sync + 'static)>`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/main.rs:89:51
[INFO] [stdout]     |
[INFO] [stdout] 89  |     let router = handlers::setup_router(&cfg, db, gh, cmds_tx)?;
[INFO] [stdout]     |                                                   ^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout]     = note: required for the cast from `Arc<GHApi>` to `Arc<(dyn github::GH + Send + Sync + 'static)>`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]   --> src/main.rs:89:47
[INFO] [stdout]    |
[INFO] [stdout] 89 |     let router = handlers::setup_router(&cfg, db, gh, cmds_tx)?;
[INFO] [stdout]    |                                               ^^ `DB` is not dyn compatible
[INFO] [stdout]    |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]   --> src/db.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub(crate) trait DB {
[INFO] [stdout]    |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23 |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24 |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]    |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27 |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30 |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33 |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36 |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39 |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42 |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45 |     async fn store_vote(
[INFO] [stdout]    |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53 |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56 |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]    = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]    = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]    = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]    = help: consider moving `has_vote` to another trait
[INFO] [stdout]    = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]    = help: consider moving `store_vote` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]    = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/main.rs:89:51
[INFO] [stdout]     |
[INFO] [stdout] 89  |     let router = handlers::setup_router(&cfg, db, gh, cmds_tx)?;
[INFO] [stdout]     |                                                   ^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `axum`
[INFO] [stdout]   --> src/main.rs:93:5
[INFO] [stdout]    |
[INFO] [stdout] 93 |     axum::serve(listener, router).with_graceful_shutdown(shutdown_signal()).await.unwrap();
[INFO] [stdout]    |     ^^^^ use of unresolved module or unlinked crate `axum`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `axum`, use `cargo add axum` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0752]: `main` function is not allowed to be `async`
[INFO] [stdout]   --> src/main.rs:44:1
[INFO] [stdout]    |
[INFO] [stdout] 44 | async fn main() -> Result<()> {
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `main` function is not allowed to be `async`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cfg.rs:29:13
[INFO] [stdout]     |
[INFO] [stdout] 29  |         gh: DynGH,
[INFO] [stdout]     |             ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cfg.rs:93:13
[INFO] [stdout]     |
[INFO] [stdout] 93  |         gh: DynGH,
[INFO] [stdout]     |             ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cfg.rs:34:18
[INFO] [stdout]     |
[INFO] [stdout] 34  |         match gh.get_config_file(inst_id, owner, repo).await {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cfg.rs:34:15
[INFO] [stdout]     |
[INFO] [stdout] 34  |         match gh.get_config_file(inst_id, owner, repo).await {
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `serde_yaml`
[INFO] [stdout]   --> src/cfg.rs:37:21
[INFO] [stdout]    |
[INFO] [stdout] 37 |                     serde_yaml::from_str(&content).map_err(|e| CfgError::InvalidConfig(e.to_string()))?;
[INFO] [stdout]    |                     ^^^^^^^^^^ use of unresolved module or unlinked crate `serde_yaml`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `serde_yaml`, use `cargo add serde_yaml` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cfg.rs:100:32
[INFO] [stdout]     |
[INFO] [stdout] 100 |         let mut cfg = Cfg::get(gh, inst_id, owner, repo).await?;
[INFO] [stdout]     |                                ^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cmd.rs:44:40
[INFO] [stdout]     |
[INFO] [stdout] 44  |     pub(crate) async fn from_event(gh: DynGH, event: &Event) -> Option<Self> {
[INFO] [stdout]     |                                        ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cmd.rs:95:39
[INFO] [stdout]     |
[INFO] [stdout] 95  |     async fn from_event_automatic(gh: DynGH, event: &Event) -> Result<Option<Self>> {
[INFO] [stdout]     |                                       ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cmd.rs:48:49
[INFO] [stdout]     |
[INFO] [stdout] 48  |             match Command::from_event_automatic(gh, event).await {
[INFO] [stdout]     |                                                 ^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cmd.rs:102:42
[INFO] [stdout]     |
[INFO] [stdout] 102 |                 let cfg = match Cfg::get(gh.clone(), inst_id, owner, repo).await {
[INFO] [stdout]     |                                          ^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cmd.rs:116:39
[INFO] [stdout]     |
[INFO] [stdout] 116 |                     let pr_files = gh.get_pr_files(inst_id, owner, repo, pr_number).await?;
[INFO] [stdout]     |                                       ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/cmd.rs:116:36
[INFO] [stdout]     |
[INFO] [stdout] 116 |                     let pr_files = gh.get_pr_files(inst_id, owner, repo, pr_number).await?;
[INFO] [stdout]     |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0308]: mismatched types
[INFO] [stdout]    --> src/db.rs:125:42
[INFO] [stdout]     |
[INFO] [stdout] 125 |                 &[&repository_full_name, &issue_number],
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^ expected `&&str`, found `&i64`
[INFO] [stdout]     |
[INFO] [stdout]     = note: expected reference `&&str`
[INFO] [stdout]                found reference `&i64`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/db.rs:143:48
[INFO] [stdout]     |
[INFO] [stdout] 143 |         let results = match results::calculate(gh, owner, repo, &vote).await {
[INFO] [stdout]     |                                                ^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0308]: mismatched types
[INFO] [stdout]    --> src/db.rs:175:42
[INFO] [stdout]     |
[INFO] [stdout] 175 |                 &[&repository_full_name, &issue_number],
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^ expected `&&str`, found `&i64`
[INFO] [stdout]     |
[INFO] [stdout]     = note: expected reference `&&str`
[INFO] [stdout]                found reference `&i64`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0308]: mismatched types
[INFO] [stdout]    --> src/db.rs:246:42
[INFO] [stdout]     |
[INFO] [stdout] 246 |                 &[&repository_full_name, &issue_number],
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^ expected `&&str`, found `&i64`
[INFO] [stdout]     |
[INFO] [stdout]     = note: expected reference `&&str`
[INFO] [stdout]                found reference `&i64`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0308]: mismatched types
[INFO] [stdout]    --> src/db.rs:266:42
[INFO] [stdout]     |
[INFO] [stdout] 266 |                 &[&repository_full_name, &issue_number],
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^ expected `&&str`, found `&i64`
[INFO] [stdout]     |
[INFO] [stdout]     = note: expected reference `&&str`
[INFO] [stdout]                found reference `&i64`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no function or associated item named `build_query` found for struct `AnnouncementRepoQuery` in the current scope
[INFO] [stdout]    --> src/github.rs:237:46
[INFO] [stdout]     |
[INFO] [stdout] 46  | pub struct AnnouncementRepoQuery;
[INFO] [stdout]     | -------------------------------- function or associated item `build_query` not found for this struct
[INFO] [stdout] ...
[INFO] [stdout] 237 |             .graphql(&AnnouncementRepoQuery::build_query(
[INFO] [stdout]     |                                              ^^^^^^^^^^^ function or associated item not found in `AnnouncementRepoQuery`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no function or associated item named `build_query` found for struct `CreateDiscussion` in the current scope
[INFO] [stdout]    --> src/github.rs:254:41
[INFO] [stdout]     |
[INFO] [stdout] 55  | pub struct CreateDiscussion;
[INFO] [stdout]     | --------------------------- function or associated item `build_query` not found for this struct
[INFO] [stdout] ...
[INFO] [stdout] 254 |             .graphql(&CreateDiscussion::build_query(create_discussion::Variables {
[INFO] [stdout]     |                                         ^^^^^^^^^^^ function or associated item not found in `CreateDiscussion`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]   --> src/handlers.rs:28:9
[INFO] [stdout]    |
[INFO] [stdout] 28 |     db: DynDB,
[INFO] [stdout]    |         ^^^^^ `DB` is not dyn compatible
[INFO] [stdout]    |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]   --> src/db.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub(crate) trait DB {
[INFO] [stdout]    |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23 |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24 |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]    |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27 |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30 |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33 |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36 |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39 |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42 |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45 |     async fn store_vote(
[INFO] [stdout]    |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53 |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56 |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]    = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]    = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]    = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]    = help: consider moving `has_vote` to another trait
[INFO] [stdout]    = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]    = help: consider moving `store_vote` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]    = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/handlers.rs:29:9
[INFO] [stdout]     |
[INFO] [stdout] 29  |     gh: DynGH,
[INFO] [stdout]     |         ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]   --> src/handlers.rs:38:9
[INFO] [stdout]    |
[INFO] [stdout] 38 |     db: DynDB,
[INFO] [stdout]    |         ^^^^^ `DB` is not dyn compatible
[INFO] [stdout]    |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]   --> src/db.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub(crate) trait DB {
[INFO] [stdout]    |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23 |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24 |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]    |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27 |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30 |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33 |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36 |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39 |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42 |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45 |     async fn store_vote(
[INFO] [stdout]    |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53 |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56 |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]    = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]    = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]    = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]    = help: consider moving `has_vote` to another trait
[INFO] [stdout]    = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]    = help: consider moving `store_vote` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]    = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/handlers.rs:39:9
[INFO] [stdout]     |
[INFO] [stdout] 39  |     gh: DynGH,
[INFO] [stdout]     |         ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/handlers.rs:166:31
[INFO] [stdout]     |
[INFO] [stdout] 166 | async fn set_check_status(db: DynDB, gh: DynGH, event: &PullRequestEvent) -> Result<()> {
[INFO] [stdout]     |                               ^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/handlers.rs:166:42
[INFO] [stdout]     |
[INFO] [stdout] 166 | async fn set_check_status(db: DynDB, gh: DynGH, event: &PullRequestEvent) -> Result<()> {
[INFO] [stdout]     |                                          ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]   --> src/processor.rs:52:9
[INFO] [stdout]    |
[INFO] [stdout] 52 |     db: DynDB,
[INFO] [stdout]    |         ^^^^^ `DB` is not dyn compatible
[INFO] [stdout]    |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]   --> src/db.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub(crate) trait DB {
[INFO] [stdout]    |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23 |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24 |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]    |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27 |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30 |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33 |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36 |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39 |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42 |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45 |     async fn store_vote(
[INFO] [stdout]    |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53 |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56 |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]    = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]    = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]    = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]    = help: consider moving `has_vote` to another trait
[INFO] [stdout]    = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]    = help: consider moving `store_vote` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]    = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:53:9
[INFO] [stdout]     |
[INFO] [stdout] 53  |     gh: DynGH,
[INFO] [stdout]     |         ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]   --> src/processor.rs:58:27
[INFO] [stdout]    |
[INFO] [stdout] 58 |     pub(crate) fn new(db: DynDB, gh: DynGH) -> Arc<Self> {
[INFO] [stdout]    |                           ^^^^^ `DB` is not dyn compatible
[INFO] [stdout]    |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]   --> src/db.rs:24:14
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub(crate) trait DB {
[INFO] [stdout]    |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23 |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24 |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]    |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27 |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30 |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33 |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36 |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39 |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42 |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45 |     async fn store_vote(
[INFO] [stdout]    |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53 |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56 |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]    = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]    = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]    = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]    = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]    = help: consider moving `has_vote` to another trait
[INFO] [stdout]    = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]    = help: consider moving `store_vote` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]    = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]    = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:58:38
[INFO] [stdout]     |
[INFO] [stdout] 58  |     pub(crate) fn new(db: DynDB, gh: DynGH) -> Arc<Self> {
[INFO] [stdout]     |                                      ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:246:13
[INFO] [stdout]     |
[INFO] [stdout] 246 |             self.gh.clone(),
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `ConfigNotFound` in the current scope
[INFO] [stdout]    --> src/processor.rs:258:73
[INFO] [stdout]     |
[INFO] [stdout] 258 |                     CfgError::ConfigNotFound => tmpl::ConfigNotFound {}.render()?,
[INFO] [stdout]     |                                                                         ^^^^^^ method not found in `ConfigNotFound`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:12:1
[INFO] [stdout]     |
[INFO] [stdout] 12  | pub(crate) struct ConfigNotFound {}
[INFO] [stdout]     | -------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `ConfigProfileNotFound` in the current scope
[INFO] [stdout]    --> src/processor.rs:259:81
[INFO] [stdout]     |
[INFO] [stdout] 259 |                     CfgError::ProfileNotFound => tmpl::ConfigProfileNotFound {}.render()?,
[INFO] [stdout]     |                                                                                 ^^^^^^ method not found in `ConfigProfileNotFound`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:17:1
[INFO] [stdout]     |
[INFO] [stdout] 17  | pub(crate) struct ConfigProfileNotFound {}
[INFO] [stdout]     | --------------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `InvalidConfig` in the current scope
[INFO] [stdout]    --> src/processor.rs:260:90
[INFO] [stdout]     |
[INFO] [stdout] 260 |                     CfgError::InvalidConfig(reason) => tmpl::InvalidConfig::new(&reason).render()?,
[INFO] [stdout]     |                                                                                          ^^^^^^ method not found in `InvalidConfig<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:27:1
[INFO] [stdout]     |
[INFO] [stdout] 27  | pub(crate) struct InvalidConfig<'a> {
[INFO] [stdout]     | ----------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:262:25
[INFO] [stdout]     |
[INFO] [stdout] 262 |                 self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |                         ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:262:17
[INFO] [stdout]     |
[INFO] [stdout] 262 |                 self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:268:21
[INFO] [stdout]     |
[INFO] [stdout] 268 |         if !self.gh.user_is_collaborator(inst_id, owner, repo, &i.created_by).await? {
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:268:13
[INFO] [stdout]     |
[INFO] [stdout] 268 |         if !self.gh.user_is_collaborator(inst_id, owner, repo, &i.created_by).await? {
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `VoteRestricted` in the current scope
[INFO] [stdout]    --> src/processor.rs:269:65
[INFO] [stdout]     |
[INFO] [stdout] 269 |             let body = tmpl::VoteRestricted::new(&i.created_by).render()?;
[INFO] [stdout]     |                                                                 ^^^^^^ method not found in `VoteRestricted<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:181:1
[INFO] [stdout]     |
[INFO] [stdout] 181 | pub(crate) struct VoteRestricted<'a> {
[INFO] [stdout]     | ------------------------------------ method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:270:21
[INFO] [stdout]     |
[INFO] [stdout] 270 |             self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |                     ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:270:13
[INFO] [stdout]     |
[INFO] [stdout] 270 |             self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:275:20
[INFO] [stdout]     |
[INFO] [stdout] 275 |         if self.db.has_vote_open(&i.repository_full_name, i.issue_number).await? {
[INFO] [stdout]     |                    ^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:275:12
[INFO] [stdout]     |
[INFO] [stdout] 275 |         if self.db.has_vote_open(&i.repository_full_name, i.issue_number).await? {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `VoteInProgress` in the current scope
[INFO] [stdout]    --> src/processor.rs:276:84
[INFO] [stdout]     |
[INFO] [stdout] 276 |             let body = tmpl::VoteInProgress::new(&i.created_by, i.is_pull_request).render()?;
[INFO] [stdout]     |                                                                                    ^^^^^^ method not found in `VoteInProgress<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:163:1
[INFO] [stdout]     |
[INFO] [stdout] 163 | pub(crate) struct VoteInProgress<'a> {
[INFO] [stdout]     | ------------------------------------ method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:277:21
[INFO] [stdout]     |
[INFO] [stdout] 277 |             self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |                     ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:277:13
[INFO] [stdout]     |
[INFO] [stdout] 277 |             self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `VoteCreated` in the current scope
[INFO] [stdout]    --> src/processor.rs:282:52
[INFO] [stdout]     |
[INFO] [stdout] 282 |         let body = tmpl::VoteCreated::new(i, &cfg).render()?;
[INFO] [stdout]     |                                                    ^^^^^^ method not found in `VoteCreated<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:116:1
[INFO] [stdout]     |
[INFO] [stdout] 116 | pub(crate) struct VoteCreated<'a> {
[INFO] [stdout]     | --------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:283:39
[INFO] [stdout]     |
[INFO] [stdout] 283 |         let vote_comment_id = self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |                                       ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:283:31
[INFO] [stdout]     |
[INFO] [stdout] 283 |         let vote_comment_id = self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:286:31
[INFO] [stdout]     |
[INFO] [stdout] 286 |         let vote_id = self.db.store_vote(vote_comment_id, i, &cfg).await?;
[INFO] [stdout]     |                               ^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:286:23
[INFO] [stdout]     |
[INFO] [stdout] 286 |         let vote_id = self.db.store_vote(vote_comment_id, i, &cfg).await?;
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:295:21
[INFO] [stdout]     |
[INFO] [stdout] 295 |             self.gh.create_check_run(inst_id, owner, repo, i.issue_number, &check_details).await?;
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:295:13
[INFO] [stdout]     |
[INFO] [stdout] 295 |             self.gh.create_check_run(inst_id, owner, repo, i.issue_number, &check_details).await?;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:300:14
[INFO] [stdout]     |
[INFO] [stdout] 300 |             .add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:299:9
[INFO] [stdout]     |
[INFO] [stdout] 299 | /         self.gh
[INFO] [stdout] 300 | |             .add_labels(
[INFO] [stdout] 301 | |                 inst_id,
[INFO] [stdout] 302 | |                 owner,
[INFO] [stdout] ...   |
[INFO] [stdout] 305 | |                 &[GITVOTE_LABEL, VOTE_OPEN_LABEL],
[INFO] [stdout] 306 | |             )
[INFO] [stdout]     | |_____________^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:319:21
[INFO] [stdout]     |
[INFO] [stdout] 319 |         if !self.gh.user_is_collaborator(inst_id, owner, repo, &i.cancelled_by).await? {
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:319:13
[INFO] [stdout]     |
[INFO] [stdout] 319 |         if !self.gh.user_is_collaborator(inst_id, owner, repo, &i.cancelled_by).await? {
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:325:21
[INFO] [stdout]     |
[INFO] [stdout] 325 |             self.db.cancel_vote(&i.repository_full_name, i.issue_number).await?;
[INFO] [stdout]     |                     ^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:325:13
[INFO] [stdout]     |
[INFO] [stdout] 325 |             self.db.cancel_vote(&i.repository_full_name, i.issue_number).await?;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `VoteCancelled` in the current scope
[INFO] [stdout]    --> src/processor.rs:331:85
[INFO] [stdout]     |
[INFO] [stdout] 331 |                 body = tmpl::VoteCancelled::new(&i.cancelled_by, i.is_pull_request).render()?;
[INFO] [stdout]     |                                                                                     ^^^^^^ method not found in `VoteCancelled<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:59:1
[INFO] [stdout]     |
[INFO] [stdout] 59  | pub(crate) struct VoteCancelled<'a> {
[INFO] [stdout]     | ----------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `NoVoteInProgress` in the current scope
[INFO] [stdout]    --> src/processor.rs:335:88
[INFO] [stdout]     |
[INFO] [stdout] 335 |                 body = tmpl::NoVoteInProgress::new(&i.cancelled_by, i.is_pull_request).render()?;
[INFO] [stdout]     |                                                                                        ^^^^^^ method not found in `NoVoteInProgress<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:41:1
[INFO] [stdout]     |
[INFO] [stdout] 41  | pub(crate) struct NoVoteInProgress<'a> {
[INFO] [stdout]     | -------------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:338:17
[INFO] [stdout]     |
[INFO] [stdout] 338 |         self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |                 ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:338:9
[INFO] [stdout]     |
[INFO] [stdout] 338 |         self.gh.post_comment(inst_id, owner, repo, i.issue_number, &body).await?;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:349:25
[INFO] [stdout]     |
[INFO] [stdout] 349 |                 self.gh.create_check_run(inst_id, owner, repo, i.issue_number, &check_details).await?;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:349:17
[INFO] [stdout]     |
[INFO] [stdout] 349 |                 self.gh.create_check_run(inst_id, owner, repo, i.issue_number, &check_details).await?;
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:353:21
[INFO] [stdout]     |
[INFO] [stdout] 353 |             self.gh.remove_label(inst_id, owner, repo, i.issue_number, VOTE_OPEN_LABEL).await?;
[INFO] [stdout]     |                     ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:353:13
[INFO] [stdout]     |
[INFO] [stdout] 353 |             self.gh.remove_label(inst_id, owner, repo, i.issue_number, VOTE_OPEN_LABEL).await?;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:364:34
[INFO] [stdout]     |
[INFO] [stdout] 364 |         let Some(vote) = self.db.get_open_vote(&i.repository_full_name, i.issue_number).await? else {
[INFO] [stdout]     |                                  ^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:364:26
[INFO] [stdout]     |
[INFO] [stdout] 364 |         let Some(vote) = self.db.get_open_vote(&i.repository_full_name, i.issue_number).await? else {
[INFO] [stdout]     |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Checking http v1.3.1
[INFO] [stdout] error[E0599]: no method named `render` found for struct `VoteCheckedRecently` in the current scope
[INFO] [stdout]    --> src/processor.rs:377:57
[INFO] [stdout]     |
[INFO] [stdout] 377 |                 let body = tmpl::VoteCheckedRecently {}.render()?;
[INFO] [stdout]     |                                                         ^^^^^^ method not found in `VoteCheckedRecently`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:77:1
[INFO] [stdout]     |
[INFO] [stdout] 77  | pub(crate) struct VoteCheckedRecently {}
[INFO] [stdout]     | ------------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:378:25
[INFO] [stdout]     |
[INFO] [stdout] 378 |                 self.gh.post_comment(inst_id, owner, repo, vote.issue_number, &body).await?;
[INFO] [stdout]     |                         ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:378:17
[INFO] [stdout]     |
[INFO] [stdout] 378 |                 self.gh.post_comment(inst_id, owner, repo, vote.issue_number, &body).await?;
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:385:42
[INFO] [stdout]     |
[INFO] [stdout] 385 |         let results = results::calculate(self.gh.clone(), owner, repo, &vote).await?;
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `VoteStatus` in the current scope
[INFO] [stdout]    --> src/processor.rs:388:52
[INFO] [stdout]     |
[INFO] [stdout] 388 |         let body = tmpl::VoteStatus::new(&results).render()?;
[INFO] [stdout]     |                                                    ^^^^^^ method not found in `VoteStatus<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:195:1
[INFO] [stdout]     |
[INFO] [stdout] 195 | pub(crate) struct VoteStatus<'a> {
[INFO] [stdout]     | -------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:389:17
[INFO] [stdout]     |
[INFO] [stdout] 389 |         self.gh.post_comment(inst_id, owner, repo, vote.issue_number, &body).await?;
[INFO] [stdout]     |                 ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:389:9
[INFO] [stdout]     |
[INFO] [stdout] 389 |         self.gh.post_comment(inst_id, owner, repo, vote.issue_number, &body).await?;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:392:17
[INFO] [stdout]     |
[INFO] [stdout] 392 |         self.db.update_vote_last_check(vote.vote_id).await?;
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:392:9
[INFO] [stdout]     |
[INFO] [stdout] 392 |         self.db.update_vote_last_check(vote.vote_id).await?;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:401:45
[INFO] [stdout]     |
[INFO] [stdout] 401 |         let Some((vote, results)) = self.db.close_finished_vote(self.gh.clone()).await? else {
[INFO] [stdout]     |                                             ^^^^^^^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `DB` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:401:37
[INFO] [stdout]     |
[INFO] [stdout] 401 |         let Some((vote, results)) = self.db.close_finished_vote(self.gh.clone()).await? else {
[INFO] [stdout]     |                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `DB` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/db.rs:24:14
[INFO] [stdout]     |
[INFO] [stdout] 22  | pub(crate) trait DB {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 23  |     /// Cancel open vote (if exists) in the issue/pr provided.
[INFO] [stdout] 24  |     async fn cancel_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Uuid>>;
[INFO] [stdout]     |              ^^^^^^^^^^^ ...because method `cancel_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 27  |     async fn close_finished_vote(&self, gh: DynGH) -> Result<Option<(Vote, Option<VoteResults>)>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `close_finished_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 30  |     async fn get_open_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<Option<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `get_open_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 33  |     async fn get_open_votes_with_close_on_passing(&self) -> Result<Vec<Vote>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_open_votes_with_close_on_passing` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 36  |     async fn get_pending_status_checks(&self) -> Result<Vec<CheckVoteInput>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get_pending_status_checks` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 39  |     async fn has_vote(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^ ...because method `has_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 42  |     async fn has_vote_open(&self, repository_full_name: &str, issue_number: i64) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^ ...because method `has_vote_open` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 45  |     async fn store_vote(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `store_vote` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 53  |     async fn update_vote_ends_at(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_ends_at` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 56  |     async fn update_vote_last_check(&self, vote_id: Uuid) -> Result<()>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^ ...because method `update_vote_last_check` is `async`
[INFO] [stdout]     = help: consider moving `cancel_vote` to another trait
[INFO] [stdout]     = help: consider moving `close_finished_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_vote` to another trait
[INFO] [stdout]     = help: consider moving `get_open_votes_with_close_on_passing` to another trait
[INFO] [stdout]     = help: consider moving `get_pending_status_checks` to another trait
[INFO] [stdout]     = help: consider moving `has_vote` to another trait
[INFO] [stdout]     = help: consider moving `has_vote_open` to another trait
[INFO] [stdout]     = help: consider moving `store_vote` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_ends_at` to another trait
[INFO] [stdout]     = help: consider moving `update_vote_last_check` to another trait
[INFO] [stdout]     = help: only type `db::PgDB` implements `DB`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:401:45
[INFO] [stdout]     |
[INFO] [stdout] 401 |         let Some((vote, results)) = self.db.close_finished_vote(self.gh.clone()).await? else {
[INFO] [stdout]     |                                             ^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:401:65
[INFO] [stdout]     |
[INFO] [stdout] 401 |         let Some((vote, results)) = self.db.close_finished_vote(self.gh.clone()).await? else {
[INFO] [stdout]     |                                                                 ^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `VoteClosed` in the current scope
[INFO] [stdout]    --> src/processor.rs:416:55
[INFO] [stdout]     |
[INFO] [stdout] 416 |             let body = tmpl::VoteClosed::new(results).render()?;
[INFO] [stdout]     |                                                       ^^^^^^ method not found in `VoteClosed<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:82:1
[INFO] [stdout]     |
[INFO] [stdout] 82  | pub(crate) struct VoteClosed<'a> {
[INFO] [stdout]     | -------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:417:21
[INFO] [stdout]     |
[INFO] [stdout] 417 |             self.gh.post_comment(inst_id, owner, repo, vote.issue_number, &body).await?;
[INFO] [stdout]     |                     ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:417:13
[INFO] [stdout]     |
[INFO] [stdout] 417 |             self.gh.post_comment(inst_id, owner, repo, vote.issue_number, &body).await?;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0599]: no method named `render` found for struct `VoteClosedAnnouncement` in the current scope
[INFO] [stdout]    --> src/processor.rs:424:97
[INFO] [stdout]     |
[INFO] [stdout] 424 |                     tmpl::VoteClosedAnnouncement::new(vote.issue_number, &issue_title, results).render()?;
[INFO] [stdout]     |                                                                                                 ^^^^^^ method not found in `VoteClosedAnnouncement<'_>`
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/tmpl.rs:96:1
[INFO] [stdout]     |
[INFO] [stdout] 96  | pub(crate) struct VoteClosedAnnouncement<'a> {
[INFO] [stdout]     | -------------------------------------------- method `render` not found for this struct
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:427:22
[INFO] [stdout]     |
[INFO] [stdout] 427 |                     .create_discussion(inst_id, owner, repo, &discussions.category, &title, &body)
[INFO] [stdout]     |                      ^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:425:35
[INFO] [stdout]     |
[INFO] [stdout] 425 |                   if let Err(err) = self
[INFO] [stdout]     |  ___________________________________^
[INFO] [stdout] 426 | |                     .gh
[INFO] [stdout] 427 | |                     .create_discussion(inst_id, owner, repo, &discussions.category, &title, &body)
[INFO] [stdout]     | |__________________________________________________________________________________________________^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:466:21
[INFO] [stdout]     |
[INFO] [stdout] 466 |             self.gh.create_check_run(inst_id, owner, repo, vote.issue_number, &check_details).await?;
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:466:13
[INFO] [stdout]     |
[INFO] [stdout] 466 |             self.gh.create_check_run(inst_id, owner, repo, vote.issue_number, &check_details).await?;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:470:17
[INFO] [stdout]     |
[INFO] [stdout] 470 |         self.gh.remove_label(inst_id, owner, repo, vote.issue_number, VOTE_OPEN_LABEL).await?;
[INFO] [stdout]     |                 ^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/processor.rs:470:9
[INFO] [stdout]     |
[INFO] [stdout] 470 |         self.gh.remove_label(inst_id, owner, repo, vote.issue_number, VOTE_OPEN_LABEL).await?;
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/results.rs:125:9
[INFO] [stdout]     |
[INFO] [stdout] 125 |     gh: DynGH,
[INFO] [stdout]     |         ^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/results.rs:132:24
[INFO] [stdout]     |
[INFO] [stdout] 132 |     let reactions = gh.get_comment_reactions(inst_id, owner, repo, vote.vote_comment_id).await?;
[INFO] [stdout]     |                        ^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/results.rs:132:21
[INFO] [stdout]     |
[INFO] [stdout] 132 |     let reactions = gh.get_comment_reactions(inst_id, owner, repo, vote.vote_comment_id).await?;
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/results.rs:135:29
[INFO] [stdout]     |
[INFO] [stdout] 135 |     let allowed_voters = gh.get_allowed_voters(inst_id, &vote.cfg, owner, repo, &vote.organization).await?;
[INFO] [stdout]     |                             ^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0038]: the trait `github::GH` is not dyn compatible
[INFO] [stdout]    --> src/results.rs:135:26
[INFO] [stdout]     |
[INFO] [stdout] 135 |     let allowed_voters = gh.get_allowed_voters(inst_id, &vote.cfg, owner, repo, &vote.organization).await?;
[INFO] [stdout]     |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `github::GH` is not dyn compatible
[INFO] [stdout]     |
[INFO] [stdout] note: for a trait to be dyn compatible it needs to allow building a vtable
[INFO] [stdout]       for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
[INFO] [stdout]    --> src/github.rs:62:14
[INFO] [stdout]     |
[INFO] [stdout] 60  | pub(crate) trait GH {
[INFO] [stdout]     |                  -- this trait is not dyn compatible...
[INFO] [stdout] 61  |     /// Add labels to the provided issue.
[INFO] [stdout] 62  |     async fn add_labels(
[INFO] [stdout]     |              ^^^^^^^^^^ ...because method `add_labels` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 72  |     async fn create_check_run(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `create_check_run` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 82  |     async fn create_discussion(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `create_discussion` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 93  |     async fn get_allowed_voters(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^ ...because method `get_allowed_voters` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 104 |     async fn get_collaborators(&self, inst_id: u64, owner: &str, repo: &str) -> Result<Vec<UserName>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `get_collaborators` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 107 |     async fn get_comment_reactions(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^ ...because method `get_comment_reactions` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn get_config_file(&self, inst_id: u64, owner: &str, repo: &str) -> Option<String>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^ ...because method `get_config_file` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 119 |     async fn get_pr_files(&self, inst_id: u64, owner: &str, repo: &str, pr_number: i64) -> Result<Vec<File>>;
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `get_pr_files` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 123 |     async fn get_team_members(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^ ...because method `get_team_members` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 133 |     async fn is_check_required(&self, inst_id: u64, owner: &str, repo: &str, branch: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^ ...because method `is_check_required` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 136 |     async fn post_comment(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `post_comment` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 146 |     async fn remove_label(
[INFO] [stdout]     |              ^^^^^^^^^^^^ ...because method `remove_label` is `async`
[INFO] [stdout] ...
[INFO] [stdout] 156 |     async fn user_is_collaborator(&self, inst_id: u64, owner: &str, repo: &str, user: &str) -> Result<bool>;
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^ ...because method `user_is_collaborator` is `async`
[INFO] [stdout]     = help: consider moving `get_config_file` to another trait
[INFO] [stdout]     = help: consider moving `get_pr_files` to another trait
[INFO] [stdout]     = help: consider moving `add_labels` to another trait
[INFO] [stdout]     = help: consider moving `create_check_run` to another trait
[INFO] [stdout]     = help: consider moving `create_discussion` to another trait
[INFO] [stdout]     = help: consider moving `get_allowed_voters` to another trait
[INFO] [stdout]     = help: consider moving `get_collaborators` to another trait
[INFO] [stdout]     = help: consider moving `get_comment_reactions` to another trait
[INFO] [stdout]     = help: consider moving `get_team_members` to another trait
[INFO] [stdout]     = help: consider moving `is_check_required` to another trait
[INFO] [stdout]     = help: consider moving `post_comment` to another trait
[INFO] [stdout]     = help: consider moving `remove_label` to another trait
[INFO] [stdout]     = help: consider moving `user_is_collaborator` to another trait
[INFO] [stdout]     = help: only type `github::GHApi` implements `github::GH`; consider using it directly instead.
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `askama`
[INFO] [stdout]    --> src/tmpl.rs:217:10
[INFO] [stdout]     |
[INFO] [stdout] 217 |     ) -> askama::Result<Vec<(UserName, UserVote)>> {
[INFO] [stdout]     |          ^^^^^^ use of unresolved module or unlinked crate `askama`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `askama`, use `cargo add askama` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `graphql_client`
[INFO] [stdout]    --> src/github.rs:236:23
[INFO] [stdout]     |
[INFO] [stdout] 236 |         let response: graphql_client::Response<announcement_repo_query::ResponseData> = client
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `graphql_client`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `graphql_client`, use `cargo add graphql_client` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `announcement_repo_query`
[INFO] [stdout]    --> src/github.rs:236:48
[INFO] [stdout]     |
[INFO] [stdout] 236 |         let response: graphql_client::Response<announcement_repo_query::ResponseData> = client
[INFO] [stdout]     |                                                ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                                                |
[INFO] [stdout]     |                                                use of unresolved module or unlinked crate `announcement_repo_query`
[INFO] [stdout]     |                                                help: a struct with a similar name exists: `AnnouncementRepoQuery`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `announcement_repo_query`, use `cargo add announcement_repo_query` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `announcement_repo_query`
[INFO] [stdout]    --> src/github.rs:238:17
[INFO] [stdout]     |
[INFO] [stdout] 238 |                 announcement_repo_query::Variables {
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 use of unresolved module or unlinked crate `announcement_repo_query`
[INFO] [stdout]     |                 help: a struct with a similar name exists: `AnnouncementRepoQuery`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `announcement_repo_query`, use `cargo add announcement_repo_query` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `graphql_client`
[INFO] [stdout]    --> src/github.rs:253:16
[INFO] [stdout]     |
[INFO] [stdout] 253 |         let _: graphql_client::Response<create_discussion::ResponseData> = client
[INFO] [stdout]     |                ^^^^^^^^^^^^^^ use of unresolved module or unlinked crate `graphql_client`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `graphql_client`, use `cargo add graphql_client` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `create_discussion`
[INFO] [stdout]    --> src/github.rs:253:41
[INFO] [stdout]     |
[INFO] [stdout] 253 |         let _: graphql_client::Response<create_discussion::ResponseData> = client
[INFO] [stdout]     |                                         ^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                                         |
[INFO] [stdout]     |                                         use of unresolved module or unlinked crate `create_discussion`
[INFO] [stdout]     |                                         help: a struct with a similar name exists: `CreateDiscussion`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `create_discussion`, use `cargo add create_discussion` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `create_discussion`
[INFO] [stdout]    --> src/github.rs:254:53
[INFO] [stdout]     |
[INFO] [stdout] 254 |             .graphql(&CreateDiscussion::build_query(create_discussion::Variables {
[INFO] [stdout]     |                                                     ^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                                                     |
[INFO] [stdout]     |                                                     use of unresolved module or unlinked crate `create_discussion`
[INFO] [stdout]     |                                                     help: a struct with a similar name exists: `CreateDiscussion`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `create_discussion`, use `cargo add create_discussion` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout]    --> src/github.rs:470:45
[INFO] [stdout]     |
[INFO] [stdout] 470 |                     let event: IssueEvent = serde_json::from_slice(event_body)
[INFO] [stdout]     |                                             ^^^^^^^^^^ use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `serde_json`, use `cargo add serde_json` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout]    --> src/github.rs:475:52
[INFO] [stdout]     |
[INFO] [stdout] 475 |                     let event: IssueCommentEvent = serde_json::from_slice(event_body)
[INFO] [stdout]     |                                                    ^^^^^^^^^^ use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `serde_json`, use `cargo add serde_json` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout]    --> src/github.rs:480:51
[INFO] [stdout]     |
[INFO] [stdout] 480 |                     let event: PullRequestEvent = serde_json::from_slice(event_body)
[INFO] [stdout]     |                                                   ^^^^^^^^^^ use of unresolved module or unlinked crate `serde_json`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `serde_json`, use `cargo add serde_json` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `octocrab`
[INFO] [stdout]    --> src/github.rs:650:88
[INFO] [stdout]     |
[INFO] [stdout] 650 |     if let Some(octocrab::Error::GitHub { source, backtrace: _ }) = err.downcast_ref::<octocrab::Error>() {
[INFO] [stdout]     |                                                                                        ^^^^^^^^ use of unresolved module or unlinked crate `octocrab`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `octocrab`, use `cargo add octocrab` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]   --> src/handlers.rs:30:14
[INFO] [stdout]    |
[INFO] [stdout] 30 |     cmds_tx: async_channel::Sender<Command>,
[INFO] [stdout]    |              ^^^^^^^^^^^^^ use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `async_channel`, use `cargo add async_channel` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]   --> src/handlers.rs:40:14
[INFO] [stdout]    |
[INFO] [stdout] 40 |     cmds_tx: async_channel::Sender<Command>,
[INFO] [stdout]    |              ^^^^^^^^^^^^^ use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `async_channel`, use `cargo add async_channel` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]   --> src/handlers.rs:78:27
[INFO] [stdout]    |
[INFO] [stdout] 78 |     State(cmds_tx): State<async_channel::Sender<Command>>,
[INFO] [stdout]    |                           ^^^^^^^^^^^^^ use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `async_channel`, use `cargo add async_channel` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `hex`
[INFO] [stdout]    --> src/handlers.rs:140:23
[INFO] [stdout]     |
[INFO] [stdout] 140 |         .and_then(|s| hex::decode(s).ok())
[INFO] [stdout]     |                       ^^^ use of unresolved module or unlinked crate `hex`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `hex`, use `cargo add hex` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]   --> src/processor.rs:65:18
[INFO] [stdout]    |
[INFO] [stdout] 65 |         cmds_tx: async_channel::Sender<Command>,
[INFO] [stdout]    |                  ^^^^^^^^^^^^^ use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `async_channel`, use `cargo add async_channel` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]   --> src/processor.rs:66:19
[INFO] [stdout]    |
[INFO] [stdout] 66 |         cmds_rx: &async_channel::Receiver<Command>,
[INFO] [stdout]    |                   ^^^^^^^^^^^^^ use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]    |
[INFO] [stdout]    = help: if you wanted to use a crate named `async_channel`, use `cargo add async_channel` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]    --> src/processor.rs:100:18
[INFO] [stdout]     |
[INFO] [stdout] 100 |         cmds_rx: async_channel::Receiver<Command>,
[INFO] [stdout]     |                  ^^^^^^^^^^^^^ use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `async_channel`, use `cargo add async_channel` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:103:9
[INFO] [stdout]     |
[INFO] [stdout] 103 |         tokio::spawn(async move {
[INFO] [stdout]     |         ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `tokio`, use `cargo add tokio` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:135:9
[INFO] [stdout]     |
[INFO] [stdout] 135 |         tokio::spawn(async move {
[INFO] [stdout]     |         ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `tokio`, use `cargo add tokio` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]    --> src/processor.rs:170:18
[INFO] [stdout]     |
[INFO] [stdout] 170 |         cmds_tx: async_channel::Sender<Command>,
[INFO] [stdout]     |                  ^^^^^^^^^^^^^ use of unresolved module or unlinked crate `async_channel`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `async_channel`, use `cargo add async_channel` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:173:9
[INFO] [stdout]     |
[INFO] [stdout] 173 |         tokio::spawn(async move {
[INFO] [stdout]     |         ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `tokio`, use `cargo add tokio` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]    --> src/processor.rs:201:9
[INFO] [stdout]     |
[INFO] [stdout] 201 |         tokio::spawn(async move {
[INFO] [stdout]     |         ^^^^^ use of unresolved module or unlinked crate `tokio`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `tokio`, use `cargo add tokio` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0433]: failed to resolve: use of unresolved module or unlinked crate `humantime`
[INFO] [stdout]    --> src/tmpl.rs:151:23
[INFO] [stdout]     |
[INFO] [stdout] 151 |             duration: humantime::format_duration(cfg.duration).to_string(),
[INFO] [stdout]     |                       ^^^^^^^^^ use of unresolved module or unlinked crate `humantime`
[INFO] [stdout]     |
[INFO] [stdout]     = help: if you wanted to use a crate named `humantime`, use `cargo add humantime` to add it to your `Cargo.toml`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] Some errors have detailed explanations: E0038, E0308, E0425, E0432, E0433, E0599, E0752.
[INFO] [stdout] 
[INFO] [stdout] For more information about an error, try `rustc --explain E0038`.
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `gitvote` (bin "gitvote") due to 246 previous errors
[INFO] [stderr] warning: build failed, waiting for other jobs to finish...
[INFO] running `Command { std: "docker" "inspect" "80b634ff5c4a20deeb036f221ad448490c87404f0c03c1455c36a68d61c78fa4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "80b634ff5c4a20deeb036f221ad448490c87404f0c03c1455c36a68d61c78fa4", kill_on_drop: false }`
[INFO] [stdout] 80b634ff5c4a20deeb036f221ad448490c87404f0c03c1455c36a68d61c78fa4
