forked from vieter-v/vieter
				
			Merge pull request 'feat(cli): lists are now properly formatted in an ascii table' (#181) from Chewing_Bever/vieter:pretty-cli into dev
Reviewed-on: vieter/vieter#181remotes/1739821333615734048/dev
						commit
						c01d849b9e
					
				| 
						 | 
					@ -1 +1,56 @@
 | 
				
			||||||
module console
 | 
					module console
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import arrays
 | 
				
			||||||
 | 
					import strings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// pretty_table converts a list of string data into a pretty table. Many thanks
 | 
				
			||||||
 | 
					// to @hungrybluedev in the Vlang Discord for providing this code!
 | 
				
			||||||
 | 
					// https://ptb.discord.com/channels/592103645835821068/592106336838352923/970278787143045192
 | 
				
			||||||
 | 
					pub fn pretty_table(header []string, data [][]string) ?string {
 | 
				
			||||||
 | 
						column_count := header.len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mut column_widths := []int{len: column_count, init: header[it].len}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for values in data {
 | 
				
			||||||
 | 
							for col, value in values {
 | 
				
			||||||
 | 
								if column_widths[col] < value.len {
 | 
				
			||||||
 | 
									column_widths[col] = value.len
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						single_line_length := arrays.sum(column_widths)? + (column_count + 1) * 3 - 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						horizontal_line := '+' + strings.repeat(`-`, single_line_length) + '+'
 | 
				
			||||||
 | 
						mut buffer := strings.new_builder(data.len * single_line_length)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buffer.writeln(horizontal_line)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buffer.write_string('| ')
 | 
				
			||||||
 | 
						for col, head in header {
 | 
				
			||||||
 | 
							if col != 0 {
 | 
				
			||||||
 | 
								buffer.write_string(' | ')
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							buffer.write_string(head)
 | 
				
			||||||
 | 
							buffer.write_string(strings.repeat(` `, column_widths[col] - head.len))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buffer.writeln(' |')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buffer.writeln(horizontal_line)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for values in data {
 | 
				
			||||||
 | 
							buffer.write_string('| ')
 | 
				
			||||||
 | 
							for col, value in values {
 | 
				
			||||||
 | 
								if col != 0 {
 | 
				
			||||||
 | 
									buffer.write_string(' | ')
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								buffer.write_string(value)
 | 
				
			||||||
 | 
								buffer.write_string(strings.repeat(` `, column_widths[col] - value.len))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							buffer.writeln(' |')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buffer.writeln(horizontal_line)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return buffer.str()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@ import cli
 | 
				
			||||||
import env
 | 
					import env
 | 
				
			||||||
import cron.expression { parse_expression }
 | 
					import cron.expression { parse_expression }
 | 
				
			||||||
import client
 | 
					import client
 | 
				
			||||||
 | 
					import console
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Config {
 | 
					struct Config {
 | 
				
			||||||
	address string [required]
 | 
						address string [required]
 | 
				
			||||||
| 
						 | 
					@ -122,10 +123,9 @@ pub fn cmd() cli.Command {
 | 
				
			||||||
fn list(conf Config) ? {
 | 
					fn list(conf Config) ? {
 | 
				
			||||||
	c := client.new(conf.address, conf.api_key)
 | 
						c := client.new(conf.address, conf.api_key)
 | 
				
			||||||
	repos := c.get_git_repos()?
 | 
						repos := c.get_git_repos()?
 | 
				
			||||||
 | 
						data := repos.map([it.id.str(), it.url, it.branch, it.repo])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for repo in repos {
 | 
						println(console.pretty_table(['id', 'url', 'branch', 'repo'], data)?)
 | 
				
			||||||
		println('$repo.id\t$repo.url\t$repo.branch\t$repo.repo')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// add adds a new repository to the server's list.
 | 
					// add adds a new repository to the server's list.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@ import cli
 | 
				
			||||||
import env
 | 
					import env
 | 
				
			||||||
import client
 | 
					import client
 | 
				
			||||||
import db
 | 
					import db
 | 
				
			||||||
 | 
					import console
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Config {
 | 
					struct Config {
 | 
				
			||||||
	address string [required]
 | 
						address string [required]
 | 
				
			||||||
| 
						 | 
					@ -66,10 +67,11 @@ pub fn cmd() cli.Command {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// print_log_list prints a list of logs.
 | 
					// print_log_list prints a list of logs.
 | 
				
			||||||
fn print_log_list(logs []db.BuildLog) {
 | 
					fn print_log_list(logs []db.BuildLog) ? {
 | 
				
			||||||
	for log in logs {
 | 
						data := logs.map([it.id.str(), it.repo_id.str(), it.start_time.str(),
 | 
				
			||||||
		println('$log.id\t$log.start_time\t$log.exit_code')
 | 
							it.exit_code.str()])
 | 
				
			||||||
	}
 | 
					
 | 
				
			||||||
 | 
						println(console.pretty_table(['id', 'repo', 'start time', 'exit code'], data)?)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// list prints a list of all build logs.
 | 
					// list prints a list of all build logs.
 | 
				
			||||||
| 
						 | 
					@ -77,7 +79,7 @@ fn list(conf Config) ? {
 | 
				
			||||||
	c := client.new(conf.address, conf.api_key)
 | 
						c := client.new(conf.address, conf.api_key)
 | 
				
			||||||
	logs := c.get_build_logs()?.data
 | 
						logs := c.get_build_logs()?.data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	print_log_list(logs)
 | 
						print_log_list(logs)?
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// list prints a list of all build logs for a given repo.
 | 
					// list prints a list of all build logs for a given repo.
 | 
				
			||||||
| 
						 | 
					@ -85,7 +87,7 @@ fn list_for_repo(conf Config, repo_id int) ? {
 | 
				
			||||||
	c := client.new(conf.address, conf.api_key)
 | 
						c := client.new(conf.address, conf.api_key)
 | 
				
			||||||
	logs := c.get_build_logs_for_repo(repo_id)?.data
 | 
						logs := c.get_build_logs_for_repo(repo_id)?.data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	print_log_list(logs)
 | 
						print_log_list(logs)?
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// info print the detailed info for a given build log.
 | 
					// info print the detailed info for a given build log.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue