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 }