summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 80c40ab4400ab73c3fa2274eff531d8a9c6e0764 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use eframe::egui;
use postgres::{Client, NoTls};

struct MyApp {
    client: Option<Client>,
    tables: Vec<String>,
    selected_table: Option<String>,
    error: Option<String>,
}

impl Default for MyApp {
    fn default() -> Self {
        let mut app = Self {
            client: None,
            tables: Vec::new(),
            selected_table: None,
            error: None,
        };
        app.connect_and_load_tables();
        app
    }
}

impl MyApp {
    fn connect_and_load_tables(&mut self) {
        let result = Client::connect(
            "host=localhost user=postgres password=test dbname=testdb",
            NoTls,
        );

        match result {
            Ok(mut client) => {
                let rows = client.query(
                    "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'",
                    &[],
                );
                match rows {
                    Ok(rows) => {
                        self.tables = rows.iter().map(|r| r.get(0)).collect();
                    }
                    Err(e) => self.error = Some(format!("Query-Fehler: {e}")),
                }
                self.client = Some(client);
            }
            Err(e) => self.error = Some(format!("Verbindungsfehler: {e}")),
        }
    }
}

impl eframe::App for MyApp {
    fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ui, |ui| {
            ui.heading("Postgres Tabellen-Browser");

            if let Some(err) = &self.error {
                ui.colored_label(egui::Color32::RED, err);
                return;
            }

            egui::ComboBox::from_label("Tabelle")
                .selected_text(self.selected_table.clone().unwrap_or_default())
                .show_ui(ui, |ui| {
                    for table in &self.tables {
                        ui.selectable_value(&mut self.selected_table, Some(table.clone()), table);
                    }
                });
        });
    }
}

fn main() -> eframe::Result<()> {
    eframe::run_native(
        "Postgres Browser",
        eframe::NativeOptions::default(),
        Box::new(|_cc| Ok(Box::new(MyApp::default()))),
    )
}