Gehversuche in Rust

Zeilen in komma-separierte Werte umwandeln

Ich brauchte ein kleines Tool, um aus mehreren Zeilen eine einzige Zeile zu erzeugen, in denen die Werte in den Zeilen in eine einzige Zeile, getrennt durch Kommata, umgewandelt werden. Dabei sollen Zeichenketten von einem Hochkomma umschlossen werden. Zahlenwerte werde nicht umgewandelt.

Dieses kleine Tool ist insbesondere in SQL-Tools wie z.B. DBeaver gut zu gebrauchen, wenn Ergebnisse in einem IN-Clause untergebracht werden sollen, z.B.

SELECT * FROM user WHERE user_name IN ('Mustermann', 'Musterfrau')

Weil ich mir Rust ohnehin einmal anschauen wollte, habe das mit dieser Programmiersprache umgesetzt:

extern crate clipboard;

use clipboard::ClipboardContext;
use clipboard::ClipboardProvider;

fn convert_to_line(s: &str) -> String {
    s.split(|c| c == '\n')
        .collect::<Vec<&str>>()
        .iter()
        .map(|s| match s.trim().parse::<f64>() {
            Ok(_ok) => format!("{}", s),
            Err(_e) => format!("'{}'", s),
        })
        .collect::<Vec<String>>()
        .join(", ")
}

fn main() {
    let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap();
    let copied = ctx.get_contents().unwrap();
    let to_paste = convert_to_line(&copied);
    //println!("{}", split(content));
    ctx.set_contents(to_paste).unwrap();
}

Mit guten Kotlin- und inzwischen angestaubte Ruby-Kenntnissen habe ich für diese wenigen Zeilen knapp eine Stunde gebraucht. Dabei kämpft man anfangs mit dem Compiler, weshalb eine gewisse Frustresistenz erforderlich ist. Auch wenn ich meine, das Borrow-System grundsätzlich verstanden zu haben, ist die Umsetzung in der Praxis dann doch kein Durchgang. Die Fehlermeldungen sind indes vorbildlich. Sie enthalten sogar Vorschläge für den Programmierer, wie man es richtig macht oder was man gemeint haben könnte.

Belohnt wird man mit einem Kompilat, dass in Sachen Sicherheit einer Lösung in C weit voraus ist. Mit 500 KB finde ich das Ergebnis zwar jetzt nicht wirklich winzig, aber im Zeitalter von Giga- und Terabytes ist das nun wirklich kein Argument mehr.

Dennoch gibt es eine kleine Enttäuschung, das aber eher mit der Kombination Bibliothek (Clipboard Crate) und Betriebssystem zu tun hat. Unter Windows funktioniert die Lösung wie erwartet, unter einer Ubuntu-Distribution (Pop_OS!) leider nicht. In Kürze schaue ich mir auch das Ergebnis unter MacOS 10.15 an (Beitrag wird dann aktualisiert).

Bestimmt werde ich das Tool noch mit anderen Programmiersprachen umsetzen, um die Gelegenheit zu ergreifen, neue Programmiersprachen zu lernen, alte aufzufrischen und die Umsetzungen miteinander zu vergleichen. Zur Auswahl stehen: Python, Typescript / NodeJS, FreePascal, eventuell D und C99, wobei ich bei Letzterem wohl den Clipboard-Zugriff für jedes Betriebssystem selbst schreiben muss. Aber so lerne ich auch die Eigenheiten der Betriebssysteme kennen.

Der Quellcode befindet sich auf Github: https://github.com/oberning/rows2line

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.