This repository has been archived by the owner on Nov 18, 2023. It is now read-only.
/
helper.go
76 lines (67 loc) · 1.96 KB
/
helper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package s3
import (
"fmt"
"net/url"
"strings"
"github.com/relloyd/halfpipe/constants"
"github.com/relloyd/halfpipe/rdbms/shared"
)
type AwsS3Bucket struct {
Name string `errorTxt:"bucket name" mandatory:"yes"`
Prefix string `errorTxt:"bucket prefix"`
Region string `errorTxt:"bucket region" mandatory:"yes"`
Dsn string
}
func (d AwsS3Bucket) Parse() error {
_, err := ParseDSN(fmt.Sprintf("%s/%s", d.Name, d.Prefix), d.Region)
return err
}
func (d AwsS3Bucket) GetScheme() (string, error) {
return constants.ConnectionTypeS3, nil
}
func (d AwsS3Bucket) GetMap(m map[string]string) map[string]string {
if m == nil {
m = make(map[string]string)
}
m["name"] = d.Name
m["prefix"] = d.Prefix
m["region"] = d.Region
return m
}
func NewAwsBucket(c *shared.ConnectionDetails) *AwsS3Bucket {
return &AwsS3Bucket{
Name: c.Data["name"],
Prefix: c.Data["prefix"],
Region: c.Data["region"],
}
}
// ParseDSN expects bucketPrefix to be of the form [s3://]<bucket>/<prefix>
// It returns an AwsS3Bucket populated with the components of bucketPrefix and the supplied region.
// If there is a parsing error it returns an error.
// The region may be empty.
func ParseDSN(bucketPrefix string, region string) (retval AwsS3Bucket, err error) {
expectedScheme := "s3"
s3url, err := url.Parse(bucketPrefix)
if err != nil {
return retval, fmt.Errorf("error parsing S3 URL: %v", err)
}
if s3url.Scheme != "" && s3url.Scheme != expectedScheme {
return retval, fmt.Errorf("expected S3 URL scheme %q but got %q", expectedScheme, s3url.Scheme)
}
if region == "" {
return retval, fmt.Errorf("value expected for bucket region")
}
retval.Name = s3url.Host
if retval.Name == "" {
return retval, fmt.Errorf("DSN failed to parse bucket name")
}
retval.Prefix = strings.Trim(s3url.Path, "/")
retval.Region = region
return
}
func AwsBucketToMap(m map[string]string, b AwsS3Bucket) map[string]string {
m["name"] = b.Name
m["prefix"] = b.Prefix
m["region"] = b.Region
return m
}