The crates ship with minimal examples that compile with the public API.
crates/plugin-api/examples/info-plugin.rscrates/plugin-api/examples/logo-animation-plugin.rs
Effect implementations live in the
xfetch-cli/effects
repository (one crate per effect, binary xfetch-effect-<name>):
effects/decrypteffects/glitch
Extensions are plain binaries using xfetch-extension-api types:
read a ConfigProviderRequest from stdin and write a
ConfigProviderResponse to stdout. Official extensions live in the
xfetch-cli/extensions
repository.
use serde::Deserialize;
use xfetch_plugin_api::{read_info_plugin_args_or_default, write_info_lines};
#[derive(Debug, Default, Deserialize)]
struct ExampleArgs {
label: Option<String>,
}
fn main() {
let args = match read_info_plugin_args_or_default::<ExampleArgs>() {
Ok(value) => value,
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
}
};
let label = args.label.unwrap_or_else(|| "example".to_string());
if let Err(err) = write_info_lines(vec![format!("plugin says: {}", label)]) {
eprintln!("{}", err);
std::process::exit(1);
}
}use xfetch_plugin_api::{AnimationFrame, read_logo_animation_request, write_logo_animation_frames};
fn main() {
let request = match read_logo_animation_request() {
Ok(value) => value,
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
}
};
let frames = vec![AnimationFrame::new(80, request.lines)];
if let Err(err) = write_logo_animation_frames(frames) {
eprintln!("{}", err);
std::process::exit(1);
}
}use std::time::Duration;
use xfetch_effect_api::{EffectFrame, read_effect_request, with_timeout, write_effect_frames};
use xfetch_effects_lib::reveal;
const BUDGET: Duration = Duration::from_secs(10);
fn main() {
let frames: Vec<EffectFrame> = with_timeout(BUDGET, || {
let request = read_effect_request().expect("read request");
let fps = request.args.fps.unwrap_or(30).max(1);
let duration_ms = request.args.duration_ms.unwrap_or(1500).max(1);
let frame_count = ((duration_ms * fps) / 1000).max(1);
let frame_delay = (1000.0 / fps as f64) as u64;
(0..=frame_count)
.map(|i| {
let progress = i as f64 / frame_count as f64;
let delay = if i == frame_count { 1 } else { frame_delay };
EffectFrame::new(
delay,
request.lines.iter().map(|l| reveal(l, progress, i)).collect(),
)
})
.collect()
})
.expect("generate frames");
write_effect_frames(frames).expect("write frames");
}use std::io::Read;
use xfetch_extension_api::ConfigProviderRequest;
fn main() {
let mut input = String::new();
std::io::stdin()
.read_to_string(&mut input)
.expect("read request");
let request: ConfigProviderRequest =
serde_json::from_str(&input).expect("parse request");
// Modify the config however you like, then write it back.
let mut config = request.config;
config["show_colors"] = serde_json::json!(false);
let response = serde_json::json!({ "config": config });
println!("{}", response);
}