package progdoc import ( "context" "errors" "os" "github.com/go-openapi/runtime" "github.com/go-openapi/strfmt" "github.com/netlify/open-api/v2/go/porcelain" netlify_ctx "github.com/netlify/open-api/v2/go/porcelain/context" ) type SiteBuilder struct { opts []Option } func Site(opts ...Option) *SiteBuilder { return &SiteBuilder{ opts: opts, } } func (sb *SiteBuilder) Generate() error { _, err := sb.generate() if err != nil { return err } return err } func (sb *SiteBuilder) Publish() error { genOut, err := sb.generate() if err != nil { return err } return sb.deployToNetlify(genOut) } func (sb *SiteBuilder) generate() (generation, error) { siteMap := siteMap{} for _, opt := range sb.opts { if err := opt.configSitemap(&siteMap); err != nil { return generation{}, err } } if len(siteMap.Pages) == 0 { return generation{}, errors.New("No pages found") } gen := generator{} genOut, err := gen.genSite(siteMap) if err != nil { return generation{}, err } return genOut, nil } func (sb *SiteBuilder) deployToNetlify(genOut generation) error { netlifyAuthToken := os.Getenv("NETLIFY_AUTH_TOKEN") if netlifyAuthToken == "" { return errors.New("NETLIFY_AUTH_TOKEN is not set") } netlifySiteID := os.Getenv("NETLIFY_SITE_ID") if netlifySiteID == "" { return errors.New("NETLIFY_SITE_ID is not set") } ctx := context.Background() ctx = netlify_ctx.WithAuthInfo(ctx, runtime.ClientAuthInfoWriterFunc(func(r runtime.ClientRequest, _ strfmt.Registry) error { return r.SetHeaderParam("Authorization", "Bearer "+netlifyAuthToken) })) client := porcelain.Default _, err := client.DeploySite(ctx, porcelain.DeployOptions{ SiteID: netlifySiteID, Dir: genOut.OutDir, }) if err != nil { return err } return nil }