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

schema.loadFromURL   A

Complexity

Conditions 3

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 9
nop 1
dl 0
loc 13
rs 9.95
c 0
b 0
f 0
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