github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/types/range.go (about)

     1  package types
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io/fs"
     7  	"path/filepath"
     8  )
     9  
    10  func NewRange(filename string, startLine int, endLine int, sourcePrefix string, srcFS fs.FS) Range {
    11  	r := Range{
    12  		filename:     filename,
    13  		startLine:    startLine,
    14  		endLine:      endLine,
    15  		fs:           srcFS,
    16  		fsKey:        CreateFSKey(srcFS),
    17  		sourcePrefix: sourcePrefix,
    18  	}
    19  	return r
    20  }
    21  
    22  func NewRangeWithLogicalSource(filename string, startLine int, endLine int, sourcePrefix string,
    23  	srcFS fs.FS) Range {
    24  	r := Range{
    25  		filename:        filename,
    26  		startLine:       startLine,
    27  		endLine:         endLine,
    28  		fs:              srcFS,
    29  		fsKey:           CreateFSKey(srcFS),
    30  		sourcePrefix:    sourcePrefix,
    31  		isLogicalSource: true,
    32  	}
    33  	return r
    34  }
    35  
    36  func NewRangeWithFSKey(filename string, startLine int, endLine int, sourcePrefix string, fsKey string, fs fs.FS) Range {
    37  	r := Range{
    38  		filename:     filename,
    39  		startLine:    startLine,
    40  		endLine:      endLine,
    41  		fs:           fs,
    42  		fsKey:        fsKey,
    43  		sourcePrefix: sourcePrefix,
    44  	}
    45  	return r
    46  }
    47  
    48  type Range struct {
    49  	filename        string
    50  	startLine       int
    51  	endLine         int
    52  	sourcePrefix    string
    53  	isLogicalSource bool
    54  	fs              fs.FS
    55  	fsKey           string
    56  }
    57  
    58  func (r Range) MarshalJSON() ([]byte, error) {
    59  	return json.Marshal(map[string]interface{}{
    60  		"filename":        r.filename,
    61  		"startLine":       r.startLine,
    62  		"endLine":         r.endLine,
    63  		"sourcePrefix":    r.sourcePrefix,
    64  		"fsKey":           r.fsKey,
    65  		"isLogicalSource": r.isLogicalSource,
    66  	})
    67  }
    68  
    69  func (r *Range) UnmarshalJSON(data []byte) error {
    70  	var keys map[string]interface{}
    71  	if err := json.Unmarshal(data, &keys); err != nil {
    72  		return err
    73  	}
    74  	if keys["filename"] != nil {
    75  		r.filename = keys["filename"].(string)
    76  	}
    77  	if keys["startLine"] != nil {
    78  		r.startLine = int(keys["startLine"].(float64))
    79  	}
    80  	if keys["endLine"] != nil {
    81  		r.endLine = int(keys["endLine"].(float64))
    82  	}
    83  	if keys["sourcePrefix"] != nil {
    84  		r.sourcePrefix = keys["sourcePrefix"].(string)
    85  	}
    86  	if keys["fsKey"] != nil {
    87  		r.fsKey = keys["fsKey"].(string)
    88  	}
    89  	if keys["isLogicalSource"] != nil {
    90  		r.isLogicalSource = keys["isLogicalSource"].(bool)
    91  	}
    92  	return nil
    93  }
    94  
    95  func (r Range) GetFSKey() string {
    96  	return r.fsKey
    97  }
    98  
    99  func (r Range) LineCount() int {
   100  	if r.endLine == 0 {
   101  		return 0
   102  	}
   103  	return (r.endLine - r.startLine) + 1
   104  }
   105  
   106  func (r Range) GetFilename() string {
   107  	if r.sourcePrefix == "" {
   108  		return r.filename
   109  	}
   110  	if r.isLogicalSource {
   111  		return fmt.Sprintf("%s:%s", r.sourcePrefix, r.filename)
   112  	}
   113  	return filepath.Join(r.sourcePrefix, r.filename)
   114  }
   115  
   116  func (r Range) GetLocalFilename() string {
   117  	return r.filename
   118  }
   119  
   120  func (r Range) GetStartLine() int {
   121  	return r.startLine
   122  }
   123  
   124  func (r Range) GetEndLine() int {
   125  	return r.endLine
   126  }
   127  
   128  func (r Range) IsMultiLine() bool {
   129  	return r.startLine < r.endLine
   130  }
   131  
   132  func (r Range) String() string {
   133  	if r.startLine != r.endLine {
   134  		return fmt.Sprintf("%s:%d-%d", r.GetFilename(), r.startLine, r.endLine)
   135  	}
   136  	if r.startLine == 0 && r.endLine == 0 {
   137  		return r.GetFilename()
   138  	}
   139  	return fmt.Sprintf("%s:%d", r.GetFilename(), r.startLine)
   140  }
   141  
   142  func (r Range) GetFS() fs.FS {
   143  	return r.fs
   144  }
   145  
   146  func (r Range) GetSourcePrefix() string {
   147  	return r.sourcePrefix
   148  }