github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/cmds/core/base64/base64.go (about)

     1  // Copyright 2021 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // base64 - encode and decode base64 from stdin or file to stdout
     6  
     7  // Synopsis:
     8  //     base64 [-d] [FILE]
     9  
    10  // Description:
    11  //    Encode or decode a file to or from base64 encoding.
    12  //    -d   decode data (default is to encode)
    13  //    For stdin, on standard Unix systems, you can use /dev/stdin
    14  
    15  package main
    16  
    17  import (
    18  	"encoding/base64"
    19  	"errors"
    20  	"flag"
    21  	"fmt"
    22  	"io"
    23  	"log"
    24  	"os"
    25  )
    26  
    27  var (
    28  	decode      = flag.Bool("d", false, "Decode")
    29  	errBadUsage = errors.New("usage: base64 [-d] [file]")
    30  )
    31  
    32  func do(r io.Reader, w io.Writer, decode bool) error {
    33  	op := "decoding"
    34  	if decode {
    35  		r = base64.NewDecoder(base64.RawStdEncoding, r)
    36  	} else {
    37  		op = "encoding"
    38  		w = base64.NewEncoder(base64.RawStdEncoding, w)
    39  	}
    40  
    41  	if _, err := io.Copy(w, r); err != nil {
    42  		return fmt.Errorf("error %s the data: %w", op, err)
    43  	}
    44  	return nil
    45  }
    46  
    47  // run runs the base64 command. Why use ...string?
    48  // makes testing a tad easier (so we don't have an if in main()
    49  // allows us, should we wish, in future, to go with using
    50  // names[1] as out. base64 commands are very nonstandard.
    51  func run(stdin io.Reader, stdout io.Writer, decode bool, names ...string) error {
    52  	switch len(names) {
    53  	case 0:
    54  	case 1:
    55  		f, err := os.Open(names[0])
    56  		if err != nil {
    57  			return err
    58  		}
    59  		stdin = f
    60  	default:
    61  		return errBadUsage
    62  	}
    63  
    64  	return do(stdin, stdout, decode)
    65  }
    66  
    67  func main() {
    68  	flag.Parse()
    69  	if err := run(os.Stdin, os.Stdout, *decode, flag.Args()...); err != nil {
    70  		log.Fatalf("base64: %v", err)
    71  	}
    72  }