From 4f1ae98508a78cf61471aed01ee1a6fcf2ec2fba Mon Sep 17 00:00:00 2001 From: Taylor Blau Date: Tue, 13 Jun 2017 14:52:21 -0600 Subject: [PATCH] tools: implement tools.Rjust([]string{...}) --- tools/str_tools.go | 25 +++++++++++++++++++++++-- tools/str_tools_test.go | 15 +++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/tools/str_tools.go b/tools/str_tools.go index caa64ff8..1c287ff3 100644 --- a/tools/str_tools.go +++ b/tools/str_tools.go @@ -1,6 +1,9 @@ package tools -import "regexp" +import ( + "regexp" + "strings" +) var ( // quoteFieldRe greedily matches between matching pairs of '', "", or @@ -43,6 +46,24 @@ func QuotedFields(s string) []string { return out } +// Rjust returns a copied string slice where each element is right justified to +// match the width of the longest element in the set. +func Rjust(strs []string) []string { + llen := len(Longest(strs)) + + dup := make([]string, len(strs), cap(strs)) + copy(dup, strs) + + for i, str := range strs { + width := MaxInt(0, llen-len(str)) + padding := strings.Repeat(" ", width) + + dup[i] = padding + str + } + + return dup +} + // Longest returns the longest element in the string slice in O(n) time and O(1) // space. If strs is empty or nil, an empty string will be returned. func Longest(strs []string) string { @@ -52,7 +73,7 @@ func Longest(strs []string) string { var longest string var llen int - for _, str := range longest { + for _, str := range strs { if len(str) >= llen { longest = str llen = len(longest) diff --git a/tools/str_tools_test.go b/tools/str_tools_test.go index 34311a02..e41a3aa1 100644 --- a/tools/str_tools_test.go +++ b/tools/str_tools_test.go @@ -82,3 +82,18 @@ func TestLongestReturnsLongestString(t *testing.T) { func TestLongestReturnsLastStringGivenSameLength(t *testing.T) { assert.Equal(t, "baz", []string{"foo", "bar", "baz"}) } + +func TestRjustRightJustifiesString(t *testing.T) { + unjust := []string{ + "short", + "longer", + "longest", + } + expected := []string{ + " short", + " longer", + "longest", + } + + assert.Equal(t, expected, Rjust(unjust)) +}