// Copyright 2019 Drone.IO Inc. All rights reserved. // Use of this source code is governed by the Drone Non-Commercial License // that can be found in the LICENSE file. package ccmenu import ( "encoding/xml" "fmt" "time" "github.com/drone/drone/core" ) type CCProjects struct { XMLName xml.Name `xml:"Projects"` Project *CCProject `xml:"Project"` } type CCProject struct { XMLName xml.Name `xml:"Project"` Name string `xml:"name,attr"` Activity string `xml:"activity,attr"` LastBuildStatus string `xml:"lastBuildStatus,attr"` LastBuildLabel string `xml:"lastBuildLabel,attr"` LastBuildTime string `xml:"lastBuildTime,attr"` WebURL string `xml:"webUrl,attr"` } // New creates a new CCPojrect from the Repository and Build details. func New(r *core.Repository, b *core.Build, link string) *CCProjects { proj := &CCProject{ Name: r.Slug, WebURL: link, Activity: "Building", LastBuildStatus: "Unknown", LastBuildLabel: "Unknown", } // if the build is not currently running then // we can return the latest build status. if b.Status != core.StatusPending && b.Status != core.StatusRunning && b.Status != core.StatusBlocked { proj.Activity = "Sleeping" proj.LastBuildTime = time.Unix(b.Started, 0).Format(time.RFC3339) proj.LastBuildLabel = fmt.Sprint(b.Number) } // ensure the last build Status accepts a valid // ccmenu enumeration switch b.Status { case core.StatusError, core.StatusKilled, core.StatusDeclined: proj.LastBuildStatus = "Exception" case core.StatusPassing: proj.LastBuildStatus = "Success" case core.StatusFailing: proj.LastBuildStatus = "Failure" } return &CCProjects{Project: proj} }