Passed
Push — master ( bd7862...76a3d1 )
by Tolga
01:09 queued 13s
created

pkg/schema/loader.go   A

Size/Duplication

Total Lines 80
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 14
eloc 48
dl 0
loc 80
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A schema.loadFromFile 0 7 2
A schema.loadInline 0 2 1
A schema.determineSchemaType 0 7 3
A schema.isURL 0 2 2
A schema.loadFromURL 0 13 3
A schema.isFilePath 0 3 1
A schema.NewSchemaLoader 0 6 1
A schema.*SchemaLoader.LoadSchema 0 2 1
1
package schema
2
3
import (
4
	"io"
5
	"net/http"
6
	"os"
7
	"strings"
8
)
9
10
type SchemaType int
11
12
const (
13
	URL SchemaType = iota
14
	File
15
	Inline
16
)
17
18
type SchemaLoader struct {
19
	loaders map[SchemaType]func(string) (string, error)
20
}
21
22
func NewSchemaLoader() *SchemaLoader {
23
	return &SchemaLoader{
24
		loaders: map[SchemaType]func(string) (string, error){
25
			URL:    loadFromURL,
26
			File:   loadFromFile,
27
			Inline: loadInline,
28
		},
29
	}
30
}
31
32
func (s *SchemaLoader) LoadSchema(input string) (string, error) {
33
	return s.loaders[determineSchemaType(input)](input)
34
}
35
36
func determineSchemaType(input string) SchemaType {
37
	if isURL(input) {
38
		return URL
39
	} else if isFilePath(input) {
40
		return File
41
	} else {
42
		return Inline
43
	}
44
}
45
46
func isURL(input string) bool {
47
	return strings.HasPrefix(input, "http://") || strings.HasPrefix(input, "https://")
48
}
49
50
func isFilePath(input string) bool {
51
	_, err := os.Stat(input)
52
	return err == nil
53
}
54
55
func loadFromURL(url string) (string, error) {
56
	resp, err := http.Get(url)
57
	if err != nil {
58
		return "", err
59
	}
60
	defer resp.Body.Close()
61
62
	body, err := io.ReadAll(resp.Body)
63
	if err != nil {
64
		return "", err
65
	}
66
67
	return string(body), nil
68
}
69
70
func loadFromFile(path string) (string, error) {
71
	content, err := os.ReadFile(path)
72
	if err != nil {
73
		return "", err
74
	}
75
76
	return string(content), nil
77
}
78
79
func loadInline(schema string) (string, error) {
80
	return schema, nil
81
}
82