17 Commits

Author SHA1 Message Date
1000e3b0e8 Bump version to v1.2.1 2025-10-03 09:19:17 +02:00
87b316fb20 Do not use newline if within parenthesis.
This is useful for some arguments.
2025-10-03 09:13:27 +02:00
8b125ac5e7 Simplify writing with a write buffer. 2025-10-03 09:07:44 +02:00
42c0dad3b1 Ignore generated compressed man page. 2025-10-03 06:11:14 +02:00
49de6d3fd4 Add (un)installation scripts. 2025-10-02 15:44:41 +02:00
9cc79feefe Add man page. 2025-10-02 15:20:28 +02:00
2e74ca7976 README: Add more information to the Usage section. 2025-10-02 15:11:58 +02:00
2884d1dfe6 Correct some language usage in the README. 2025-10-02 15:09:59 +02:00
1ff158c650 Bump version to v1.2.0 2025-10-02 13:56:48 +02:00
9548c2c167 Fix buffer reading. 2025-10-02 13:52:01 +02:00
a123afd052 Simplify formatting. 2025-10-02 12:57:00 +02:00
4dce39e96b Only newline with comma if last_ch == ] or } 2025-10-02 09:59:37 +02:00
5565f1340a Add license to worker.rs file. 2025-09-29 15:16:31 +02:00
b90c5f5f54 Bump version to v1.1.0 2025-09-29 11:43:21 +02:00
2ede3db3b8 Better error messages. 2025-09-29 11:42:34 +02:00
54e4c065ca Limit iteration of args to after program name. 2025-09-29 10:52:26 +02:00
2a1adb048e Remove left-over ch = ch. 2025-09-29 10:48:40 +02:00
9 changed files with 189 additions and 56 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/target /target
/dbus-prettifier.1.gz

2
Cargo.lock generated
View File

@@ -4,4 +4,4 @@ version = 4
[[package]] [[package]]
name = "dbus-prettifier" name = "dbus-prettifier"
version = "1.0.0" version = "1.2.1"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "dbus-prettifier" name = "dbus-prettifier"
version = "1.0.0" version = "1.2.1"
edition = "2024" edition = "2024"
authors = [ "Nicolás A. Ortega Froysa <nicolas@ortegas.org>" ] authors = [ "Nicolás A. Ortega Froysa <nicolas@ortegas.org>" ]
description = "A tool to prettify the output of qdbus." description = "A tool to prettify the output of qdbus."

View File

@@ -1,8 +1,8 @@
# DBus Prettifier # DBus Prettifier
I noticed that when working with `qdbus` that I would get long and unformatted I noticed when working with `qdbus` that I would get long and unformatted
outputs that are extremely difficult to read. This small program will prettify a outputs that are extremely difficult to read. This small program will prettify
file with the output so that it is much more readable. a file with the output so that it is much more readable.
## Usage ## Usage
@@ -12,18 +12,29 @@ To run the program, simply run it as follows:
qdbus-prettifier <in-file> [out-file] qdbus-prettifier <in-file> [out-file]
``` ```
## Building If `<in-file>` is defined as `-` this tells the program to read from `stdin`
allowing input to be piped. If the `[out-file]` option is omitted then output is
sent to `stdout`.
For more information, check out the `-h` option.
## Building & Installation
To compile the program, install the Rust suite, namely the compiler and Cargo. To compile the program, install the Rust suite, namely the compiler and Cargo.
Once installed you can run `cargo build --release` to generate a release build Once installed you can run `cargo build --release` to generate a release build
of the project which will be found at `target/release/dbus-prettifier`. of the project which will be found at `target/release/dbus-prettifier`.
To install you can use the `install` command as follows: To install the program you can use the `install` script. By default this will
install to `/usr/local`, but this can be changed by setting the `PREFIX`
variable prior to the command. For example:
```console ```console
install -Dm755 target/release/dbus-prettifier /usr/local/bin PREFIX=/usr ./install
``` ```
Similarly, to uninstall simply run the `uninstall` script. It uses the same
`PREFIX` variable.
## License ## License
This program is licensed under the terms & conditions of the [Zlib This program is licensed under the terms & conditions of the [Zlib

37
dbus-prettifier.1 Normal file
View File

@@ -0,0 +1,37 @@
.TH dbus-prettifier "1" "October 2025" "dbus-prettifier 1.2.1" "User Commands"
.SH "NAME"
dbus-prettifier - A tool to prettify the output of qdbus.
.SH "SYNOPSIS"
.B dbus-prettifier
<\fIin-file\fR> [\fIout-file\fR]
.B dbus-prettifier
\fI-h\fR | \fI-v\fR
.SH "DESCRIPTION"
Takes input from qdbus (either stored in a file or from \fIstdin\fR) and stores
it in the provided \fIout-file\fR.
.SH "ARGUMENTS"
.TP
\fBin-file\fR
File containing qdbus output (if \fI-\fR then input is from \fIstdin\fR)
.TP
\fBout-file\fR
File to write formatted output to (if omitted then \fIstdout\fR is used)
.TP
\fB\-h\fR
Show help information
.TP
\fB\-v\fR
Show version information
.SH "AUTHOR"
Written by Nicolás A. Ortega Froysa.
.SH "COPYRIGHT"
Copyright \(co 2024 Ortega Froysa, Nicolás A. <nicolas@ortegas.org>.
License: ZLib License.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

17
install Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -euo pipefail
PREFIX=${PREFIX:="/usr/local"}
if ! [ -f "./target/release/dbus-prettifier" ]
then
>&2 echo "Failed to find release target. Please compile the project with 'cargo build --release'."
exit 1
fi
gzip -k ./dbus-prettifier.1
install -Dm644 ./dbus-prettifier.1.gz "$PREFIX/share/man/man1/"
install -Dm755 ./target/release/dbus-prettifier "$PREFIX/bin/"
rm -f ./dbus-prettifier.1.gz

View File

@@ -23,7 +23,6 @@
*/ */
use std::env; use std::env;
use std::io;
use std::process; use std::process;
use crate::worker::work; use crate::worker::work;
@@ -52,7 +51,7 @@ fn print_help() {
env!("CARGO_PKG_NAME"), env!("CARGO_PKG_NAME")); env!("CARGO_PKG_NAME"), env!("CARGO_PKG_NAME"));
} }
fn main() -> io::Result<()> { fn main() {
let args:Vec<String> = env::args().collect(); let args:Vec<String> = env::args().collect();
let mut in_path:Option<&str> = None; let mut in_path:Option<&str> = None;
let mut out_path:Option<&str> = None; let mut out_path:Option<&str> = None;
@@ -63,13 +62,13 @@ fn main() -> io::Result<()> {
process::exit(1); process::exit(1);
} }
for i in &args { for i in &args[1..args.len()] {
if i == "-h" { if i == "-h" {
print_help(); print_help();
return Ok(()); return;
} else if i == "-v" { } else if i == "-v" {
print_version(); print_version();
return Ok(()); return;
} else if i.starts_with("-") && i != "-" { } else if i.starts_with("-") && i != "-" {
eprintln!("Invalid argument '{}'. Use -h for help information.", i); eprintln!("Invalid argument '{}'. Use -h for help information.", i);
process::exit(1); process::exit(1);
@@ -83,5 +82,9 @@ fn main() -> io::Result<()> {
out_path = Some(args[2].as_str()); out_path = Some(args[2].as_str());
} }
work(in_path, out_path) let res = work(in_path, out_path);
if let Err(err) = res {
eprintln!("{}", err);
process::exit(1);
}
} }

View File

@@ -1,16 +1,42 @@
/*
* Copyright (C) 2025 Nicolás Ortega Froysa <nicolas@ortegas.org> All rights reserved.
* Author: Nicolás Ortega Froysa <nicolas@ortegas.org>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
use std::io; use std::io;
use std::fs; use std::fs;
use std::io::Read; use std::io::Read;
use std::boxed::Box; use std::boxed::Box;
// Read 1KiB of the file at a time. static MAX_WRITE_BUF_SIZE:usize = 1024;
static BLOCK_SIZE:usize = 1024;
pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> io::Result<()> { pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> Result<(), String> {
let mut in_reader:Box<dyn io::Read> = match in_path { let in_reader:Box<dyn io::Read> = match in_path {
Some(x) => { Some(path) => {
let in_file = fs::File::open(x)?; let in_file = fs::File::open(path);
Box::new(io::BufReader::new(in_file)) if let Err(e) = in_file {
return Err(format!("{path}: {e}"));
}
Box::new(io::BufReader::new(in_file.unwrap()))
}, },
None => { None => {
Box::new(io::stdin()) Box::new(io::stdin())
@@ -18,60 +44,85 @@ pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> io::Result<()> {
}; };
let mut out_writer:Box<dyn io::Write> = match out_path { let mut out_writer:Box<dyn io::Write> = match out_path {
Some(x) => { Some(path) => {
let out_file = fs::File::create(x)?; let out_file = fs::File::create(path);
Box::new(io::BufWriter::new(out_file)) if let Err(e) = out_file {
return Err(format!("{path}: {e}"));
}
Box::new(io::BufWriter::new(out_file.unwrap()))
}, },
None => { None => {
Box::new(io::stdout()) Box::new(io::stdout())
}, },
}; };
let mut read_buf:[u8; BLOCK_SIZE] = [0; BLOCK_SIZE]; let mut last_ch = '\0';
let mut last_ch:char = '\0';
let mut tab_num = 0; let mut tab_num = 0;
let mut in_paren = false;
let mut write_buf = String::new();
while in_reader.read(&mut read_buf)? > 0 { for i in in_reader.bytes() {
for i in read_buf { let ch = i.unwrap() as char;
let ch = i as char;
match ch { match ch {
'[' | '{' => { '[' | '{' => {
tab_num += 1; tab_num += 1;
out_writer.write(format!("{}\n", ch).as_bytes())?; //write_buf += format!("{ch}\n").as_str();
write_buf.push(ch);
if !in_paren {
write_buf.push('\n');
for _ in 0..tab_num { for _ in 0..tab_num {
out_writer.write(b" ")?; write_buf += " ";
} }
last_ch = ' '; last_ch = ' ';
} else {
last_ch = ch;
}
}, },
']' | '}' => { ']' | '}' => {
tab_num -= 1; tab_num -= 1;
out_writer.write(b"\n")?; if !in_paren {
write_buf += "\n";
for _ in 0..tab_num { for _ in 0..tab_num {
out_writer.write(b" ")?; write_buf += " ";
} }
out_writer.write(format!("{}", ch).as_bytes())?; }
write_buf.push(ch);
last_ch = ch; last_ch = ch;
}, },
',' => { ',' => {
out_writer.write(format!("{}\n", ch).as_bytes())?; write_buf.push(ch);
if last_ch == '}' || last_ch == ']' {
write_buf.push('\n');
for _ in 0..tab_num { for _ in 0..tab_num {
out_writer.write(b" ")?; write_buf += " ";
} }
last_ch = ' '; last_ch = ' ';
} else {
last_ch = ch;
}
}, },
_ => { _ => {
let ch = ch;
if ch != ' ' || last_ch != ' ' { if ch != ' ' || last_ch != ' ' {
out_writer.write(format!("{}", ch).as_bytes())?; if ch == '(' {
in_paren = true;
} else if ch == ')' {
in_paren = false;
}
write_buf.push(ch);
last_ch = ch; last_ch = ch;
} }
}, },
} }
if write_buf.len() >= MAX_WRITE_BUF_SIZE {
out_writer.write_all(write_buf.as_bytes()).unwrap();
write_buf.clear();
} }
} }
out_writer.flush()?; if write_buf.len() > 0 {
out_writer.write_all(write_buf.as_bytes()).unwrap();
}
Ok(()) Ok(())
} }

13
uninstall Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
set -euo pipefail
PREFIX=${PREFIX:="/usr/local"}
if ! [ -f "$PREFIX/bin/dbus-prettifier" ]
then
>&2 echo "Installation not found in prefix '$PREFIX'."
exit 1
fi
rm -f "$PREFIX/bin/dbus-prettifier"
rm -f "$PREFIX/share/man/man1/dbus-prettifier.1.gz"