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  }