Skip to content

Commit

Permalink
Add util.term, ARD and reflection fixes
Browse files Browse the repository at this point in the history
Also bump NOTICE date
  • Loading branch information
tliron committed Oct 29, 2022
1 parent ecc9037 commit aa868e5
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 56 deletions.
2 changes: 1 addition & 1 deletion NOTICE
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Kutil
Copyright 2020-2021 Tal Liron
Copyright 2020-2022 Tal Liron

---

Expand Down
25 changes: 10 additions & 15 deletions ard/yaml.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,18 @@ import (
"gopkg.in/yaml.v3"
)

func ToYAMLDocumentNode(value Value, verbose bool) *yaml.Node {
var node *yaml.Node
var ok bool
if node, ok = ToYAMLNode(value, verbose); !ok {
// Try again after canonicalization
var err error
if value, err = Canonicalize(value); err == nil {
if node, ok = ToYAMLNode(value, verbose); !ok {
panic(fmt.Sprintf("unsupported value type: %T", value))
}
func ToYAMLDocumentNode(value Value, verbose bool) (*yaml.Node, error) {
if value_, err := Canonicalize(value); err == nil {
if node, ok := ToYAMLNode(value_, verbose); ok {
return &yaml.Node{
Kind: yaml.DocumentNode,
Content: []*yaml.Node{node},
}, nil
} else {
panic(err)
return nil, fmt.Errorf("unsupported value type: %T", value_)
}
}
return &yaml.Node{
Kind: yaml.DocumentNode,
Content: []*yaml.Node{node},
} else {
return nil, err
}
}

Expand Down
2 changes: 1 addition & 1 deletion kubernetes/rest.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func Exec(rest restpkg.Interface, config *restpkg.Config, namespace string, podN
if err = executor.Stream(streamOptions); err == nil {
return nil
} else {
return NewExecError(err, stderrCapture.String())
return NewExecError(err, strings.TrimRight(stderrCapture.String(), "\n"))
}
} else {
return err
Expand Down
76 changes: 38 additions & 38 deletions reflection/traverse.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,6 @@ func TraverseEntities(entity any, locking bool, traverse EntityTraverser) {
continue
}

// Ignore if has "lookup" tag
// TODO: should this be *here*?
if _, ok := structField.Tag.Lookup("lookup"); ok {
continue
}

field := value.FieldByName(structField.Name)

// Ignore unexported fields
Expand All @@ -55,26 +49,10 @@ func TraverseEntities(entity any, locking bool, traverse EntityTraverser) {

fieldType := field.Type()

if IsPointerToStruct(fieldType) && !field.IsNil() {
if IsPointerToStruct(fieldType) {
// Compatible with *struct{}
value := field.Interface()
if lock != nil {
lock.Unlock()
}
TraverseEntities(value, locking, traverse)
if lock != nil {
lock.Lock()
}
} else if IsSliceOfPointerToStruct(fieldType) {
// Compatible with []*struct{}
length := field.Len()
elements := make([]reflect.Value, length)
for index := 0; index < length; index++ {
elements[index] = field.Index(index)
}

for _, element := range elements {
value := element.Interface()
if !field.IsNil() {
value := field.Interface()
if lock != nil {
lock.Unlock()
}
Expand All @@ -83,22 +61,44 @@ func TraverseEntities(entity any, locking bool, traverse EntityTraverser) {
lock.Lock()
}
}
} else if IsSliceOfPointerToStruct(fieldType) {
// Compatible with []*struct{}
if !field.IsNil() {
length := field.Len()
elements := make([]reflect.Value, length)
for index := 0; index < length; index++ {
elements[index] = field.Index(index)
}

for _, element := range elements {
value := element.Interface()
if lock != nil {
lock.Unlock()
}
TraverseEntities(value, locking, traverse)
if lock != nil {
lock.Lock()
}
}
}
} else if IsMapOfStringToPointerToStruct(fieldType) {
// Compatible with map[string]*struct{}
keys := field.MapKeys()
elements := make([]reflect.Value, len(keys))
for index, key := range keys {
elements[index] = field.MapIndex(key)
}

for _, element := range elements {
value := element.Interface()
if lock != nil {
lock.Unlock()
if !field.IsNil() {
keys := field.MapKeys()
elements := make([]reflect.Value, len(keys))
for index, key := range keys {
elements[index] = field.MapIndex(key)
}
TraverseEntities(value, locking, traverse)
if lock != nil {
lock.Lock()

for _, element := range elements {
value := element.Interface()
if lock != nil {
lock.Unlock()
}
TraverseEntities(value, locking, traverse)
if lock != nil {
lock.Lock()
}
}
}
}
Expand Down
5 changes: 4 additions & 1 deletion transcribe/write.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ func Write(value any, format string, indent string, strict bool, writer io.Write

func WriteYAML(value any, writer io.Writer, indent string, strict bool) error {
if strict {
value = ard.ToYAMLDocumentNode(value, true)
var err error
if value, err = ard.ToYAMLDocumentNode(value, true); err != nil {
return err
}
}

encoder := yaml.NewEncoder(writer)
Expand Down
29 changes: 29 additions & 0 deletions util/term.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package util

import (
"os"

"golang.org/x/term"
)

func ToRawTerminal(f func() error) {
stdin := int(os.Stdin.Fd())
state, err := term.MakeRaw(stdin)
FailOnError(err)

handle := OnExitError(func() error {
os.Stdout.WriteString("\r")
return term.Restore(stdin, state)
})

err = f()

if err == nil {
Exit(0)
} else {
handle.Cancel()
os.Stdout.WriteString("\r")
term.Restore(stdin, state)
FailOnError(err)
}
}

0 comments on commit aa868e5

Please sign in to comment.