| Crates.io | gouqi |
| lib.rs | gouqi |
| version | 0.15.1 |
| created_at | 2022-06-30 09:23:58.612025+00 |
| updated_at | 2025-09-17 05:06:21.452055+00 |
| description | Rust interface for Jira |
| homepage | https://github.com/wunderfrucht/gouqi |
| repository | https://github.com/wunderfrucht/gouqi |
| max_upload_size | |
| id | 616281 |
| size | 1,042,595 |
a rust interface for jira
Forked from goji https://github.com/softprops/goji
Add the following to your Cargo.toml file
[dependencies]
gouqi = "*"
# Optional: Enable async API
gouqi = { version = "*", features = ["async"] }
Please browse the examples directory in this repo for some example applications.
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.
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!");
}
}
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);
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
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