diff --git a/CHANGELOG.md b/CHANGELOG.md index bc54120a..c7c28e1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Changed + +- Print CLI tables using [comfy-table](https://crates.io/crates/comfy-table) ([#176](https://github.com/stackabletech/stackablectl/pull/176)) + ## [0.6.0] - 2022-10-28 ### Added diff --git a/Cargo.lock b/Cargo.lock index 42212b52..9afce2c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.19" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] @@ -22,9 +22,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.58" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" +checksum = "31e6e93155431f3931513b243d371981bb2770112b370c82745a1d19d2f99364" dependencies = [ "proc-macro2", "quote", @@ -37,17 +37,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ce4f10ea3abcd6617873bae9f91d1c5332b4a778bd9ce34d0cd517474c1de82" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -66,18 +55,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bstr" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "lazy_static", - "memchr", - "regex-automata", - "serde", -] - [[package]] name = "bumpalo" version = "3.11.1" @@ -86,9 +63,9 @@ checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" [[package]] name = "bytes" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" [[package]] name = "cached" @@ -129,9 +106,9 @@ checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663" [[package]] name = "cc" -version = "1.0.74" +version = "1.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581f5dba903aac52ea3feb5ec4810848460ee833876f1f9b0fdeab1f19091574" +checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" [[package]] name = "cfg-if" @@ -141,9 +118,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ "iana-time-zone", "num-integer", @@ -154,14 +131,14 @@ dependencies = [ [[package]] name = "clap" -version = "4.0.18" +version = "4.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335867764ed2de42325fafe6d18b8af74ba97ee0c590fa016f157535b42ab04b" +checksum = "4d63b9e9c07271b9957ad22c173bae2a4d9a81127680962039296abcd2f8251d" dependencies = [ - "atty", "bitflags", "clap_derive", "clap_lex", + "is-terminal", "once_cell", "strsim", "termcolor", @@ -169,18 +146,18 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.0.3" +version = "4.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe581a2035db4174cdbdc91265e1aba50f381577f0510d0ad36c7bc59cc84a3" +checksum = "b7b3c9eae0de7bf8e3f904a5e40612b21fb2e2e566456d177809a48b892d24da" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.0.18" +version = "4.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a1b0f6422af32d5da0c58e2703320f379216ee70198241c84173a8c5ac28f3" +checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" dependencies = [ "heck", "proc-macro-error", @@ -199,35 +176,24 @@ dependencies = [ ] [[package]] -name = "cli-table" -version = "0.4.7" +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adfbb116d9e2c4be7011360d0c0bee565712c11e969c9609b25b619366dc379d" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "cli-table-derive", - "csv", "termcolor", "unicode-width", ] [[package]] -name = "cli-table-derive" -version = "0.4.5" +name = "comfy-table" +version = "6.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af3bfb9da627b0a6c467624fb7963921433774ed435493b5c08a3053e829ad4" +checksum = "e621e7e86c46fd8a14c32c6ae3cb95656621b4743a27d0cffedb831d46e7ad21" dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", + "crossterm", + "strum", + "strum_macros", "unicode-width", ] @@ -248,32 +214,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] -name = "csv" -version = "1.1.6" +name = "crossterm" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" dependencies = [ - "bstr", - "csv-core", - "itoa 0.4.8", - "ryu", - "serde", + "bitflags", + "crossterm_winapi", + "libc", + "mio", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", ] [[package]] -name = "csv-core" -version = "0.1.10" +name = "crossterm_winapi" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c" dependencies = [ - "memchr", + "winapi", ] [[package]] name = "cxx" -version = "1.0.80" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7d4e43b25d3c994662706a1d4fcfc32aaa6afd287502c111b237093bb23f3a" +checksum = "d4a41a86530d0fe7f5d9ea779916b7cadd2d4f9add748b99c2c029cbbdfaf453" dependencies = [ "cc", "cxxbridge-flags", @@ -283,9 +252,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.80" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f8829ddc213e2c1368e51a2564c552b65a8cb6a28f31e576270ac81d5e5827" +checksum = "06416d667ff3e3ad2df1cd8cd8afae5da26cf9cec4d0825040f88b5ca659a2f0" dependencies = [ "cc", "codespan-reporting", @@ -298,15 +267,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.80" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e72537424b474af1460806647c41d4b6d35d09ef7fe031c5c2fa5766047cc56a" +checksum = "820a9a2af1669deeef27cb271f476ffd196a2c4b6731336011e0ba63e2c7cf71" [[package]] name = "cxxbridge-macro" -version = "1.0.80" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309e4fb93eed90e1e14bea0da16b209f81813ba9fc7830c20ed151dd7bc0a4d7" +checksum = "a08a6e2fcc370a089ad3b4aaf54db3b1b4cee38ddabce5896b33eb693275f470" dependencies = [ "proc-macro2", "quote", @@ -623,7 +592,7 @@ checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", - "itoa 1.0.4", + "itoa", ] [[package]] @@ -663,9 +632,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.22" +version = "0.14.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfba89e19b959ca163c7752ba59d737c1ceea53a5d31a149c805446fc958064" +checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" dependencies = [ "bytes", "futures-channel", @@ -676,7 +645,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.4", + "itoa", "pin-project-lite", "socket2", "tokio", @@ -770,9 +739,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown", @@ -800,9 +769,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" +checksum = "f88c5561171189e69df9d98bcf18fd5f9558300f7ea7b801eb8a0fd748bd8745" [[package]] name = "is-terminal" @@ -816,12 +785,6 @@ dependencies = [ "windows-sys 0.42.0", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.4" @@ -1011,9 +974,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" dependencies = [ "lazy_static", "libc", @@ -1048,9 +1011,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ "hermit-abi 0.1.19", "libc", @@ -1064,9 +1027,9 @@ checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "openssl" -version = "0.10.42" +version = "0.10.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13" +checksum = "020433887e44c27ff16365eaa2d380547a94544ad509aff6eb5b6e3e0b27b376" dependencies = [ "bitflags", "cfg-if", @@ -1096,18 +1059,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "111.22.0+1.1.1q" +version = "111.24.0+1.1.1s" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f31f0d509d1c1ae9cada2f9539ff8f37933831fd5098879e482aa687d659853" +checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.77" +version = "0.9.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03b84c3b2d099b81f0953422b4d4ad58761589d0229b5506356afca05a3670a" +checksum = "07d5c8cb6e57b3a3612064d7b18b117912b4ce70955c2504d4b741c9e244b132" dependencies = [ "autocfg", "cc", @@ -1128,9 +1091,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.3.1" +version = "6.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3baf96e39c5359d2eb0dd6ccb42c62b91d9678aa68160d261b9e0ccbf9e9dea9" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" [[package]] name = "parking_lot" @@ -1144,9 +1107,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ "cfg-if", "libc", @@ -1272,26 +1235,20 @@ dependencies = [ [[package]] name = "regex" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-syntax" -version = "0.6.27" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "remove_dir_all" @@ -1304,9 +1261,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc" +checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" dependencies = [ "base64", "bytes", @@ -1353,6 +1310,12 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + [[package]] name = "ryu" version = "1.0.11" @@ -1422,9 +1385,9 @@ checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" [[package]] name = "serde" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc" dependencies = [ "serde_derive", ] @@ -1441,9 +1404,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c" dependencies = [ "proc-macro2", "quote", @@ -1452,12 +1415,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" +checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ "indexmap", - "itoa 1.0.4", + "itoa", "ryu", "serde", ] @@ -1469,7 +1432,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.4", + "itoa", "ryu", "serde", ] @@ -1493,12 +1456,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d232d893b10de3eb7258ff01974d6ee20663d8e833263c99409d4b13a0209da" dependencies = [ "indexmap", - "itoa 1.0.4", + "itoa", "ryu", "serde", "unsafe-libyaml", ] +[[package]] +name = "signal-hook" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -1540,7 +1524,7 @@ dependencies = [ "cached", "clap", "clap_complete", - "cli-table", + "comfy-table", "env_logger", "gobuild", "indexmap", @@ -1564,11 +1548,30 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + [[package]] name = "syn" -version = "1.0.103" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" dependencies = [ "proc-macro2", "quote", @@ -1635,9 +1638,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.21.2" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" +checksum = "d76ce4a75fb488c605c54bf610f221cea8b0dafb53333c1a67e8ee199dcd2ae3" dependencies = [ "autocfg", "bytes", @@ -1664,9 +1667,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 57414948..47c7a9c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ repository = "https://github.com/stackabletech/stackablectl" cached = { version = "0.40", features = ['async_tokio_rt_multi_thread'] } clap = { version = "4.0", features = ["derive", "cargo"] } clap_complete = "4.0" -cli-table = "0.4" +comfy-table = "6.1" env_logger = "0.10" indexmap = { version = "1.9", features = ["serde"] } k8s-openapi = { version = "0.16", default-features = false, features = ["v1_24"] } diff --git a/src/demo.rs b/src/demo.rs index 88c50991..6fc1a1af 100644 --- a/src/demo.rs +++ b/src/demo.rs @@ -6,6 +6,10 @@ use crate::{ }; use cached::proc_macro::cached; use clap::{Parser, ValueHint}; +use comfy_table::{ + presets::{NOTHING, UTF8_FULL}, + Cell, ContentArrangement, Table, +}; use indexmap::IndexMap; use lazy_static::lazy_static; use log::{info, warn}; @@ -106,15 +110,23 @@ async fn list_demos(output_type: &OutputType) -> Result<(), Box> { let output = get_demos().await; match output_type { OutputType::Text => { - println!( - "DEMO STACKABLE STACK DESCRIPTION" - ); - for (demo_name, demo) in output.demos.iter() { - println!( - "{:35} {:28} {}", - demo_name, demo.stackable_stack, demo.description, - ); + let mut table = Table::new(); + table + .load_preset(UTF8_FULL) + .set_content_arrangement(ContentArrangement::Dynamic) + .set_header(vec![ + Cell::new("Demo"), + Cell::new("Stackable stack"), + Cell::new("Description"), + ]); + for (demo_name, demo) in output.demos { + table.add_row(vec![ + Cell::new(demo_name), + Cell::new(demo.stackable_stack), + Cell::new(demo.description), + ]); } + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output)?); @@ -149,13 +161,28 @@ async fn describe_demo(demo_name: &str, output_type: &OutputType) -> Result<(), match output_type { OutputType::Text => { - println!("Demo: {}", output.demo); - println!("Description: {}", output.description); + let mut table = Table::new(); + table + .load_preset(NOTHING) + .set_content_arrangement(ContentArrangement::Dynamic) + .add_row(vec![Cell::new("Demo"), Cell::new(output.demo)]) + .add_row(vec![ + Cell::new("Description"), + Cell::new(output.description), + ]); if let Some(documentation) = output.documentation { - println!("Documentation: {}", documentation); + table.add_row(vec![Cell::new("Documentation"), Cell::new(documentation)]); } - println!("Stackable stack: {}", output.stackable_stack); - println!("Labels: {}", output.labels.join(", ")); + table + .add_row(vec![ + Cell::new("Stackable stack"), + Cell::new(output.stackable_stack), + ]) + .add_row(vec![ + Cell::new("Labels"), + Cell::new(output.labels.join(", ")), + ]); + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output).unwrap()); diff --git a/src/operator.rs b/src/operator.rs index f1e06ffe..43e11215 100644 --- a/src/operator.rs +++ b/src/operator.rs @@ -1,5 +1,9 @@ use crate::{arguments::OutputType, helm, helm::HELM_REPOS, kind, AVAILABLE_OPERATORS}; use clap::{Parser, ValueHint}; +use comfy_table::{ + presets::{NOTHING, UTF8_FULL}, + Cell, ContentArrangement, Table, +}; use indexmap::IndexMap; use log::{info, warn}; use semver::Version; @@ -114,14 +118,18 @@ async fn list_operators(output_type: &OutputType) -> Result<(), Box> match output_type { OutputType::Text => { - println!("OPERATOR STABLE VERSIONS"); - for (operator, operator_entry) in output { - println!( - "{:18} {}", - operator, - operator_entry.stable_versions.join(", ") - ); + let mut table = Table::new(); + table + .load_preset(UTF8_FULL) + .set_content_arrangement(ContentArrangement::Dynamic) + .set_header(vec![Cell::new("Operator"), Cell::new("Stable versions")]); + for (operator_name, operator) in output { + table.add_row(vec![ + Cell::new(operator_name), + Cell::new(operator.stable_versions.join(", ")), + ]); } + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output)?); @@ -152,10 +160,24 @@ async fn describe_operator(operator: &str, output_type: &OutputType) -> Result<( match output_type { OutputType::Text => { - println!("Operator: {}", output.operator); - println!("Stable versions: {}", output.stable_versions.join(", ")); - println!("Test versions: {}", output.test_versions.join(", ")); - println!("Dev versions: {}", output.dev_versions.join(", ")); + let mut table = Table::new(); + table + .load_preset(NOTHING) + .set_content_arrangement(ContentArrangement::Dynamic) + .add_row(vec![Cell::new("Operator"), Cell::new(output.operator)]) + .add_row(vec![ + Cell::new("Stable versions"), + Cell::new(output.stable_versions.join(", ")), + ]) + .add_row(vec![ + Cell::new("Test versions"), + Cell::new(output.test_versions.join(", ")), + ]) + .add_row(vec![ + Cell::new("Dev versions"), + Cell::new(output.dev_versions.join(", ")), + ]); + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output)?); diff --git a/src/release.rs b/src/release.rs index 28ba624e..5f4dd937 100644 --- a/src/release.rs +++ b/src/release.rs @@ -1,6 +1,10 @@ use crate::{arguments::OutputType, helpers, kind, operator, operator::Operator, CliArgs}; use cached::proc_macro::cached; use clap::{ArgGroup, Parser, ValueHint}; +use comfy_table::{ + presets::{NOTHING, UTF8_FULL}, + Cell, ContentArrangement, Table, +}; use indexmap::IndexMap; use lazy_static::lazy_static; use log::{error, info, warn}; @@ -131,13 +135,23 @@ async fn list_releases(output_type: &OutputType) -> Result<(), Box> { let output = get_releases().await; match output_type { OutputType::Text => { - println!("RELEASE RELEASE DATE DESCRIPTION"); - for (release_name, release_entry) in output.releases { - println!( - "{:18} {:14} {}", - release_name, release_entry.release_date, release_entry.description, - ); + let mut table = Table::new(); + table + .load_preset(UTF8_FULL) + .set_content_arrangement(ContentArrangement::Dynamic) + .set_header(vec![ + Cell::new("Release"), + Cell::new("Release date"), + Cell::new("Description"), + ]); + for (release_name, release) in output.releases { + table.add_row(vec![ + Cell::new(release_name), + Cell::new(release.release_date), + Cell::new(release.description), + ]); } + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output)?); @@ -173,15 +187,35 @@ async fn describe_release( match output_type { OutputType::Text => { - println!("Release: {}", output.release); - println!("Release date: {}", output.release_date); - println!("Description: {}", output.description); - println!("Included products:"); - println!(); - println!("PRODUCT OPERATOR VERSION"); + let mut table = Table::new(); + table + .load_preset(NOTHING) + .set_content_arrangement(ContentArrangement::Dynamic) + .add_row(vec![Cell::new("Release"), Cell::new(output.release)]) + .add_row(vec![ + Cell::new("Release date"), + Cell::new(output.release_date), + ]) + .add_row(vec![ + Cell::new("Description"), + Cell::new(output.description), + ]) + .add_row(vec![Cell::new("Included products")]) + .add_row(vec![""]); + println!("{table}"); + + let mut table = Table::new(); + table + .load_preset(UTF8_FULL) + .set_content_arrangement(ContentArrangement::Dynamic) + .set_header(vec![Cell::new("Product"), Cell::new("Operator version")]); for (product_name, product) in output.products { - println!("{:19} {}", product_name, product.operator_version); + table.add_row(vec![ + Cell::new(product_name), + Cell::new(product.operator_version), + ]); } + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output)?); diff --git a/src/services.rs b/src/services.rs index da7d96a8..2390b745 100644 --- a/src/services.rs +++ b/src/services.rs @@ -1,8 +1,5 @@ use clap::Parser; -use cli_table::{ - format::{Border, HorizontalLine, Separator}, - Cell, Table, -}; +use comfy_table::{presets::UTF8_FULL, Cell, ContentArrangement, Table}; use indexmap::IndexMap; use k8s_openapi::api::{ apps::v1::{Deployment, StatefulSet}, @@ -182,7 +179,17 @@ async fn list_services( match output_type { OutputType::Text => { - let mut table = vec![]; + let mut table = Table::new(); + table + .load_preset(UTF8_FULL) + .set_content_arrangement(ContentArrangement::Dynamic) + .set_header(vec![ + Cell::new("Product"), + Cell::new("Name"), + Cell::new("Namespace"), + Cell::new("Endpoints"), + Cell::new("Extra infos"), + ]); let max_endpoint_name_length = output .values() @@ -208,36 +215,17 @@ async fn list_services( .collect::>() .join("\n"); - table.push(vec![ - (&product_name).cell(), - installed_product.name.as_str().cell(), - installed_product - .namespace - .clone() - .unwrap_or_default() - .cell(), - endpoints.cell(), - installed_product.extra_infos.join("\n").cell(), + table.add_row(vec![ + Cell::new(&product_name), + Cell::new(installed_product.name), + Cell::new(installed_product.namespace.unwrap_or_default()), + Cell::new(endpoints), + Cell::new(installed_product.extra_infos.join("\n")), ]); } } - let table = table - .table() - .title(vec![ - "PRODUCT".cell(), - "NAME".cell(), - "NAMESPACE".cell(), - "ENDPOINTS".cell(), - "EXTRA INFOS".cell(), - ]) - .border(Border::builder().build()) - .separator( - Separator::builder() - .row(Some(HorizontalLine::new(' ', ' ', ' ', ' '))) - .build(), - ); - - print!("{}", table.display()?); + + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output)?); diff --git a/src/stack.rs b/src/stack.rs index 25fa8568..78b7a954 100644 --- a/src/stack.rs +++ b/src/stack.rs @@ -1,6 +1,10 @@ use crate::{arguments::OutputType, helm, helm::HELM_REPOS, helpers, kind, kube, release, CliArgs}; use cached::proc_macro::cached; use clap::{Parser, ValueHint}; +use comfy_table::{ + presets::{NOTHING, UTF8_FULL}, + Cell, ContentArrangement, Table, +}; use indexmap::IndexMap; use lazy_static::lazy_static; use log::{debug, info, warn}; @@ -121,13 +125,23 @@ async fn list_stacks(output_type: &OutputType) -> Result<(), Box> { let output = get_stacks().await; match output_type { OutputType::Text => { - println!("STACK STACKABLE RELEASE DESCRIPTION"); + let mut table = Table::new(); + table + .load_preset(UTF8_FULL) + .set_content_arrangement(ContentArrangement::Dynamic) + .set_header(vec![ + Cell::new("Stack"), + Cell::new("Stackable release"), + Cell::new("Description"), + ]); for (stack_name, stack) in output.stacks { - println!( - "{:35} {:18} {}", - stack_name, stack.stackable_release, stack.description, - ); + table.add_row(vec![ + Cell::new(stack_name), + Cell::new(stack.stackable_release), + Cell::new(stack.description), + ]); } + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output)?); @@ -160,10 +174,24 @@ async fn describe_stack(stack_name: &str, output_type: &OutputType) -> Result<() match output_type { OutputType::Text => { - println!("Stack: {}", output.stack); - println!("Description: {}", output.description); - println!("Stackable release: {}", output.stackable_release); - println!("Labels: {}", output.labels.join(", ")); + let mut table = Table::new(); + table + .load_preset(NOTHING) + .set_content_arrangement(ContentArrangement::Dynamic) + .add_row(vec![Cell::new("Stack"), Cell::new(output.stack)]) + .add_row(vec![ + Cell::new("Description"), + Cell::new(output.description), + ]) + .add_row(vec![ + Cell::new("Stackable release"), + Cell::new(output.stackable_release), + ]) + .add_row(vec![ + Cell::new("Labels"), + Cell::new(output.labels.join(", ")), + ]); + println!("{table}"); } OutputType::Json => { println!("{}", serde_json::to_string_pretty(&output)?);