github.com/moov-io/imagecashletter@v0.10.1/cmd/webui/icl/icl_js.go (about) 1 // Copyright 2020 The Moov Authors 2 // Use of this source code is governed by an Apache License 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "bytes" 9 "encoding/base64" 10 "encoding/json" 11 "fmt" 12 "strings" 13 "syscall/js" 14 15 "github.com/moov-io/imagecashletter" 16 17 "github.com/vincent-petithory/dataurl" 18 ) 19 20 func decodeDataURI(input string) string { 21 u, _ := dataurl.DecodeString(input) 22 23 dst := make([]byte, base64.StdEncoding.DecodedLen(len(input))) 24 base64.StdEncoding.Decode(dst, u.Data) 25 26 return string(u.Data) 27 } 28 29 func parseContents(input string) (string, error) { 30 r := strings.NewReader(input) 31 file, err := imagecashletter.NewReader(r, 32 imagecashletter.ReadVariableLineLengthOption(), 33 imagecashletter.ReadEbcdicEncodingOption(), 34 ).Read() 35 36 var buf bytes.Buffer 37 if err2 := json.NewEncoder(&buf).Encode(file); err2 != nil { 38 err = fmt.Errorf("original error: %v and json encoder error: %v", err, err2) 39 } 40 41 return buf.String(), err 42 } 43 44 func readAsJSON(input string) (string, error) { 45 file, err := imagecashletter.FileFromJSON([]byte(input)) 46 47 pretty, err2 := json.MarshalIndent(file, "", " ") 48 if err2 != nil { 49 err = fmt.Errorf("original error: %v and json indent encoding error: %v", err, err2) 50 } 51 52 return string(pretty), err 53 } 54 55 func prettyJson(input string) (string, error) { 56 var raw interface{} 57 if err := json.Unmarshal([]byte(input), &raw); err != nil { 58 return "", err 59 } 60 pretty, err := json.MarshalIndent(raw, "", " ") 61 if err != nil { 62 return "", err 63 } 64 return string(pretty), nil 65 } 66 67 func jsonWrapper() js.Func { 68 jsonFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} { 69 if len(args) != 1 { 70 return "Invalid no of arguments passed" 71 } 72 73 input := args[0].String() 74 75 // Decode the data URI if we're given one (file uploads) 76 if strings.HasPrefix(input, "data:") { 77 input = decodeDataURI(input) 78 } 79 80 // Handle either JSON or X9-formatted contents 81 if json.Valid([]byte(input)) { 82 pretty, err := readAsJSON(input) 83 if err != nil { 84 fmt.Printf("unable to parse JSON %s\n", err) 85 return err.Error() 86 } 87 return pretty 88 } else { 89 parsed, err := parseContents(input) 90 if err != nil { 91 fmt.Printf("unable to parse contents %s\n", err) 92 return err.Error() 93 } 94 95 pretty, err := prettyJson(parsed) 96 if err != nil { 97 fmt.Printf("unable to convert to json %s\n", err) 98 return err.Error() 99 } 100 101 return pretty 102 } 103 }) 104 return jsonFunc 105 } 106 107 func main() { 108 js.Global().Set("parseContents", jsonWrapper()) 109 <-make(chan bool) 110 }