17 releases (breaking)
Uses new Rust 2024
new 0.15.1 | Sep 17, 2025 |
---|---|
0.14.0 | Aug 30, 2025 |
0.10.0 | Mar 11, 2025 |
0.9.0 | Oct 3, 2024 |
0.3.1 | Jul 1, 2022 |
#100 in Web programming
2,140 downloads per month
Used in dgira
335KB
7K
SLoC
gouqi
a rust interface for jira
Forked from goji https://github.com/softprops/goji
install
Add the following to your Cargo.toml
file
[dependencies]
gouqi = "*"
# Optional: Enable async API
gouqi = { version = "*", features = ["async"] }
usage
Please browse the examples directory in this repo for some example applications.
🚀 Jira V3 API Migration
gouqi automatically handles the Jira V3 API transition! Your existing code continues to work seamlessly:
// Works on both V2 and V3 automatically - no code changes needed!
let results = jira.search().list("project = TEST", &Default::default())?;
For advanced field control and migration details, see the Jira V3 Migration Guide.
Basic usage requires a jira host, and a flavor of jira::Credentials
for authorization.
Synchronous API
The default API uses synchronous requests:
use gouqi::{Credentials, Jira};
use std::env;
use tracing::error;
fn main() {
if let Ok(host) = env::var("JIRA_HOST") {
let query = env::args().nth(1).unwrap_or("order by created DESC".to_owned());
let jira = Jira::new(host, Credentials::Anonymous).expect("Error initializing Jira");
match jira.search().iter(query, &Default::default()) {
Ok(results) => {
for issue in results {
println!("{:#?}", issue);
}
}
Err(err) => panic!("{:#?}", err),
}
} else {
error!("Missing environment variable JIRA_HOST!");
}
}
Asynchronous API
With the async
feature enabled, you can use the asynchronous API:
use futures::stream::StreamExt;
use gouqi::{Credentials, SearchOptions};
use std::env;
use tracing::error;
#[tokio::main]
async fn main() {
if let Ok(host) = env::var("JIRA_HOST") {
let query = env::args().nth(1).unwrap_or("order by created DESC".to_owned());
// Create an async Jira client
let jira = gouqi::r#async::Jira::new(host, Credentials::Anonymous)
.expect("Error initializing Jira");
// Use the stream method to get a futures Stream
let search_options = SearchOptions::default();
match jira.search().stream(query, &search_options).await {
Ok(mut stream) => {
// Consume the stream asynchronously
while let Some(issue) = stream.next().await {
println!("{:#?}", issue);
}
}
Err(err) => error!("{:#?}", err),
}
} else {
error!("Missing environment variable JIRA_HOST!");
}
}
You can also convert between sync and async clients:
// Convert from sync to async
let sync_jira = Jira::new(host, credentials)?;
let async_jira = sync_jira.into_async();
// Convert from async to sync
let async_jira = gouqi::r#async::Jira::new(host, credentials)?;
let sync_jira = gouqi::sync::Jira::from(&async_jira);
Commiting a PR
Please make sure to run cargo fmt
, cargo test
and cargo clippy
before committing.
New code should contains tests.
Commits to follow the Conventional Commits specification.
Changelog is generated using git cliff
cargo install git-cliff
git cliff -o --use-branch-tags
what's with the name
Jira's name is a shortened form of gojira, another name for godzilla. Goji is a play on that.
Goji (Chinese: 枸杞; pinyin: gǒuqǐ)
Doug Tangren (softprops) 2016-2018
Dependencies
~6–19MB
~254K SLoC