github.com/kata-containers/tests@v0.0.0-20240307153542-772105b56064/cmd/check-markdown/display.go (about)

     1  //
     2  // Copyright (c) 2019 Intel Corporation
     3  //
     4  // SPDX-License-Identifier: Apache-2.0
     5  //
     6  
     7  package main
     8  
     9  import (
    10  	"fmt"
    11  	"os"
    12  	"sort"
    13  
    14  	"github.com/sirupsen/logrus"
    15  )
    16  
    17  var outputFile = os.Stdout
    18  
    19  // displayHandler is an interface that all output display handlers
    20  // (formatters) must implement.
    21  type DisplayHandler interface {
    22  	DisplayHeadings(d *Doc) error
    23  	DisplayLinks(d *Doc) error
    24  }
    25  
    26  // DisplayHandlers encapsulates the list of available display handlers.
    27  type DisplayHandlers struct {
    28  	handlers map[string]DisplayHandler
    29  }
    30  
    31  // handlers is a map of the available output format display handling
    32  // implementations.
    33  var handlers map[string]DisplayHandler
    34  
    35  // NewDisplayHandlers create a new DisplayHandler.
    36  func NewDisplayHandlers(tsvSeparator string, disableHeader bool) *DisplayHandlers {
    37  	separator := rune('\t')
    38  
    39  	if tsvSeparator != "" {
    40  		separator = rune(tsvSeparator[0])
    41  	}
    42  
    43  	if handlers == nil {
    44  		handlers = make(map[string]DisplayHandler)
    45  
    46  		handlers[textFormat] = NewDisplayText(outputFile)
    47  		handlers[tsvFormat] = NewDisplayTSV(outputFile, separator, disableHeader)
    48  	}
    49  
    50  	h := &DisplayHandlers{
    51  		handlers: handlers,
    52  	}
    53  
    54  	return h
    55  }
    56  
    57  // find looks for a display handler corresponding to the specified format
    58  func (d *DisplayHandlers) find(format string) DisplayHandler {
    59  	for f, handler := range d.handlers {
    60  		if f == format {
    61  			return handler
    62  		}
    63  	}
    64  
    65  	return nil
    66  }
    67  
    68  // Get returns a list of the available formatters (display handler names).
    69  func (d *DisplayHandlers) Get() []string {
    70  	var formats []string
    71  
    72  	for f := range d.handlers {
    73  		formats = append(formats, f)
    74  	}
    75  
    76  	sort.Strings(formats)
    77  
    78  	return formats
    79  }
    80  
    81  func show(inputFilename string, logger *logrus.Entry, handler DisplayHandler, what DataToShow) error {
    82  	var fn func(*Doc) error
    83  
    84  	switch what {
    85  	case showHeadings:
    86  		fn = handler.DisplayHeadings
    87  	case showLinks:
    88  		fn = handler.DisplayLinks
    89  	default:
    90  		return fmt.Errorf("unknown show option: %v", what)
    91  	}
    92  
    93  	doc := newDoc(inputFilename, logger)
    94  	doc.ListMode = true
    95  
    96  	err := doc.parse()
    97  	if err != nil {
    98  		return err
    99  	}
   100  
   101  	return fn(doc)
   102  }