diff --git a/main.go b/main.go index 15a321e..3893553 100644 --- a/main.go +++ b/main.go @@ -2,16 +2,67 @@ package main import ( "context" + "flag" + "net/url" + "os" "os/signal" "replicator/replicator" "syscall" + "time" + + "gopkg.in/yaml.v3" ) func main() { ctx, can := signal.NotifyContext(context.Background(), syscall.SIGINT) defer can() - if err := replicator.Main(ctx); err != nil && ctx.Err() == nil { + config, err := getConfig() + if err != nil { + panic(err) + } + + if err := replicator.Main(ctx, config); err != nil && ctx.Err() == nil { panic(err) } } + +func getConfig() (replicator.Config, error) { + var config replicator.Config + if p := os.Getenv("CONFIG"); p != "" { + f, err := os.Open(p) + if err != nil { + return config, err + } + defer f.Close() + if err := yaml.NewDecoder(f).Decode(&config); err != nil { + return config, err + } + } + + var srcDriver, destDriver, interval string + flag.StringVar(&srcDriver, "src", "map://", "source db") + flag.StringVar(&destDriver, "dest", "map://", "dest db") + flag.StringVar(&interval, "interval", "1s", "interval") + flag.Parse() + + if srcDriver, err := url.Parse(srcDriver); err != nil { + return config, err + } else { + config.Src.Driver = *srcDriver + } + + if destDriver, err := url.Parse(destDriver); err != nil { + return config, err + } else { + config.Dest.Driver = *destDriver + } + + if interval, err := time.ParseDuration(interval); err != nil { + return config, err + } else { + config.Interval = replicator.Duration(interval) + } + + return config, nil +} diff --git a/replicator/main.go b/replicator/main.go index deffa5e..e3e7808 100644 --- a/replicator/main.go +++ b/replicator/main.go @@ -2,9 +2,19 @@ package replicator import ( "context" - "errors" ) -func Main(ctx context.Context) error { - return errors.New("not impl") +func Main(ctx context.Context, config Config) error { + src, err := NewDriver(ctx, config.Src.Driver) + if err != nil { + return err + } + + dest, err := NewDriver(ctx, config.Dest.Driver) + if err != nil { + return err + } + + replicator := NewReplicator(dest, src) + return replicator.Stream(ctx) } diff --git a/replicator/replicator.go b/replicator/replicator.go index 3004255..7e6cfc1 100644 --- a/replicator/replicator.go +++ b/replicator/replicator.go @@ -11,7 +11,7 @@ type Replicator struct { Interval time.Duration } -func NewReplicator(src, dest Driver) Replicator { +func NewReplicator(dest, src Driver) Replicator { return Replicator{ Src: src, Dest: dest,