github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+incompatible/util/ui/ui_for_push.go (about) 1 package ui 2 3 import ( 4 "errors" 5 "fmt" 6 "reflect" 7 "sort" 8 "strings" 9 10 "code.cloudfoundry.org/cli/types" 11 12 "github.com/fatih/color" 13 ) 14 15 var ErrValueMissmatch = errors.New("values provided were of different types") 16 17 type Change struct { 18 Header string 19 CurrentValue interface{} 20 NewValue interface{} 21 HiddenValue bool 22 } 23 24 // DisplayChangeForPush will display the header and old/new value with the 25 // appropriately red/green minuses and pluses. 26 func (ui *UI) DisplayChangeForPush(header string, stringTypePadding int, hiddenValue bool, originalValue interface{}, newValue interface{}) error { 27 ui.terminalLock.Lock() 28 defer ui.terminalLock.Unlock() 29 30 originalType := reflect.ValueOf(originalValue).Type() 31 newType := reflect.ValueOf(newValue).Type() 32 if originalType != newType { 33 return ErrValueMissmatch 34 } 35 36 offset := strings.Repeat(" ", stringTypePadding) 37 38 switch oVal := originalValue.(type) { 39 case int: 40 nVal := newValue.(int) 41 ui.displayDiffForInt(offset, header, oVal, nVal) 42 case types.NullInt: 43 nVal := newValue.(types.NullInt) 44 ui.displayDiffForNullInt(offset, header, oVal, nVal) 45 case string: 46 nVal := newValue.(string) 47 ui.displayDiffForString(offset, header, hiddenValue, oVal, nVal) 48 case []string: 49 nVal := newValue.([]string) 50 if len(oVal) == 0 && len(nVal) == 0 { 51 return nil 52 } 53 54 ui.displayDiffForStrings(offset, header, oVal, nVal) 55 case map[string]string: 56 nVal := newValue.(map[string]string) 57 if len(oVal) == 0 && len(nVal) == 0 { 58 return nil 59 } 60 61 ui.displayDiffForMapStringString(offset, header, oVal, nVal) 62 default: 63 panic(fmt.Sprintf("diff display does not have case for '%s'", header)) 64 } 65 return nil 66 } 67 68 // DisplayChangesForPush will display the set of changes via 69 // DisplayChangeForPush in the order given. 70 func (ui *UI) DisplayChangesForPush(changeSet []Change) error { 71 if len(changeSet) == 0 { 72 return nil 73 } 74 75 var columnWidth int 76 for _, change := range changeSet { 77 if width := wordSize(ui.TranslateText(change.Header)); width > columnWidth { 78 columnWidth = width 79 } 80 } 81 82 for _, change := range changeSet { 83 padding := columnWidth - wordSize(ui.TranslateText(change.Header)) + 3 84 err := ui.DisplayChangeForPush(change.Header, padding, change.HiddenValue, change.CurrentValue, change.NewValue) 85 if err != nil { 86 return err 87 } 88 } 89 90 return nil 91 } 92 93 func (ui UI) displayDiffForInt(offset string, header string, oldValue int, newValue int) { 94 if oldValue != newValue { 95 formattedOld := fmt.Sprintf("- %s%s%d", ui.TranslateText(header), offset, oldValue) 96 formattedNew := fmt.Sprintf("+ %s%s%d", ui.TranslateText(header), offset, newValue) 97 98 if oldValue != 0 { 99 fmt.Fprintln(ui.Out, ui.modifyColor(formattedOld, color.New(color.FgRed))) 100 } 101 fmt.Fprintln(ui.Out, ui.modifyColor(formattedNew, color.New(color.FgGreen))) 102 } else { 103 fmt.Fprintf(ui.Out, " %s%s%d\n", ui.TranslateText(header), offset, oldValue) 104 } 105 } 106 107 func (ui UI) displayDiffForMapStringString(offset string, header string, oldMap map[string]string, newMap map[string]string) { 108 var oldKeys []string 109 for key := range oldMap { 110 oldKeys = append(oldKeys, key) 111 } 112 113 var newKeys []string 114 for key := range newMap { 115 newKeys = append(newKeys, key) 116 } 117 118 sortedKeys := sortedUniqueArray(oldKeys, newKeys) 119 120 fmt.Fprintf(ui.Out, " %s\n", ui.TranslateText(header)) 121 for _, key := range sortedKeys { 122 newVal, ok := newMap[key] 123 if !ok { 124 formattedOld := fmt.Sprintf("- %s", key) 125 fmt.Fprintln(ui.Out, ui.modifyColor(formattedOld, color.New(color.FgRed))) 126 continue 127 } 128 oldVal, ok := oldMap[key] 129 if !ok { 130 formattedNew := fmt.Sprintf("+ %s", key) 131 fmt.Fprintln(ui.Out, ui.modifyColor(formattedNew, color.New(color.FgGreen))) 132 continue 133 } 134 135 if oldVal == newVal { 136 fmt.Fprintf(ui.Out, " %s\n", key) 137 } else { 138 formattedOld := fmt.Sprintf("- %s", key) 139 fmt.Fprintln(ui.Out, ui.modifyColor(formattedOld, color.New(color.FgRed))) 140 formattedNew := fmt.Sprintf("+ %s", key) 141 fmt.Fprintln(ui.Out, ui.modifyColor(formattedNew, color.New(color.FgGreen))) 142 } 143 } 144 } 145 146 func (ui UI) displayDiffForNullInt(offset string, header string, oldValue types.NullInt, newValue types.NullInt) { 147 if oldValue != newValue { 148 formattedOld := fmt.Sprintf("- %s%s%d", ui.TranslateText(header), offset, oldValue.Value) 149 formattedNew := fmt.Sprintf("+ %s%s%d", ui.TranslateText(header), offset, newValue.Value) 150 151 if oldValue.IsSet { 152 fmt.Fprintln(ui.Out, ui.modifyColor(formattedOld, color.New(color.FgRed))) 153 } 154 fmt.Fprintln(ui.Out, ui.modifyColor(formattedNew, color.New(color.FgGreen))) 155 } else { 156 fmt.Fprintf(ui.Out, " %s%s%d\n", ui.TranslateText(header), offset, oldValue.Value) 157 } 158 } 159 160 func (ui UI) displayDiffForString(offset string, header string, hiddenValue bool, oVal string, nVal string) { 161 if oVal != nVal { 162 var formattedOld, formattedNew string 163 if hiddenValue { 164 formattedOld = fmt.Sprintf("- %s%s%s", ui.TranslateText(header), offset, RedactedValue) 165 formattedNew = fmt.Sprintf("+ %s%s%s", ui.TranslateText(header), offset, RedactedValue) 166 } else { 167 formattedOld = fmt.Sprintf("- %s%s%s", ui.TranslateText(header), offset, oVal) 168 formattedNew = fmt.Sprintf("+ %s%s%s", ui.TranslateText(header), offset, nVal) 169 } 170 171 if oVal != "" { 172 fmt.Fprintln(ui.Out, ui.modifyColor(formattedOld, color.New(color.FgRed))) 173 } 174 if nVal != "" { 175 fmt.Fprintln(ui.Out, ui.modifyColor(formattedNew, color.New(color.FgGreen))) 176 } 177 } else { 178 if hiddenValue { 179 fmt.Fprintf(ui.Out, " %s%s%s\n", ui.TranslateText(header), offset, RedactedValue) 180 } else { 181 fmt.Fprintf(ui.Out, " %s%s%s\n", ui.TranslateText(header), offset, oVal) 182 } 183 } 184 } 185 186 func (ui UI) displayDiffForStrings(offset string, header string, oldList []string, newList []string) { 187 fmt.Fprintf(ui.Out, " %s\n", ui.TranslateText(header)) 188 189 fullList := sortedUniqueArray(oldList, newList) 190 for _, item := range fullList { 191 inOld := existsIn(item, oldList) 192 inNew := existsIn(item, newList) 193 194 if inOld && inNew { 195 fmt.Fprintf(ui.Out, " %s\n", item) 196 } else if inOld { 197 formattedOld := fmt.Sprintf("- %s", item) 198 fmt.Fprintln(ui.Out, ui.modifyColor(formattedOld, color.New(color.FgRed))) 199 } else { 200 formattedNew := fmt.Sprintf("+ %s", item) 201 fmt.Fprintln(ui.Out, ui.modifyColor(formattedNew, color.New(color.FgGreen))) 202 } 203 } 204 } 205 206 func existsIn(str string, ary []string) bool { 207 for _, val := range ary { 208 if val == str { 209 return true 210 } 211 } 212 return false 213 } 214 215 func sortedUniqueArray(ary1 []string, ary2 []string) []string { 216 uniq := append([]string{}, ary1...) 217 218 for _, str := range ary2 { 219 if !existsIn(str, uniq) { 220 uniq = append(uniq, str) 221 } 222 } 223 224 sort.Strings(uniq) 225 return uniq 226 }