|  | package data | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "strings" | 
|  |  | 
|  | monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" | 
|  | ) | 
|  |  | 
|  | type DataSet interface { | 
|  | GetData() *LegacyDataSet | 
|  | } | 
|  |  | 
|  | type LegacyDataSet struct { | 
|  | Headers []string | 
|  | Data    [][]interface{} | 
|  | } | 
|  |  | 
|  | func (data *LegacyDataSet) String() string { | 
|  | lines := make([]string, len(data.Data)+1) | 
|  | lines[0] = strings.Join(data.Headers, "\t") | 
|  | for i, row := range data.Data { | 
|  | lines[i+1] = strings.Join(GetRowAsStrings(row), "\t") | 
|  | } | 
|  | return strings.Join(lines, "\n") | 
|  | } | 
|  |  | 
|  | func CreateDataSet(headers []string) *LegacyDataSet { | 
|  | return &LegacyDataSet{Headers: headers, Data: make([][]interface{}, 0)} | 
|  | } | 
|  |  | 
|  | func (lds *LegacyDataSet) GetData() *LegacyDataSet { | 
|  | return lds | 
|  | } | 
|  |  | 
|  | func (lds *LegacyDataSet) AddRow(values ...interface{}) error { | 
|  | if len(values) != len(lds.Headers) { | 
|  | return fmt.Errorf("DataSet has %d columns (%s), but new row has %d (values: %s).", len(lds.Headers), strings.Join(lds.Headers, ", "), len(values), strings.Join(GetRowAsStrings(values), ", ")) | 
|  | } | 
|  | lds.Data = append(lds.Data, values) | 
|  | return nil | 
|  | } | 
|  |  | 
|  | func GetRowAsStrings(row []interface{}) []string { | 
|  | stringValues := make([]string, len(row)) | 
|  | for i, v := range row { | 
|  | if str, ok := v.(string); ok { | 
|  | stringValues[i] = str | 
|  | } else { | 
|  | stringValues[i] = fmt.Sprintf("%v", v) | 
|  | } | 
|  | } | 
|  | return stringValues | 
|  | } | 
|  |  | 
|  | type StackDriverTimeSeriesDataSet interface { | 
|  | CreateTimeSeriesRequest(projectID string) *monitoringpb.CreateTimeSeriesRequest | 
|  | } | 
|  |  | 
|  | type PipelineID struct { | 
|  | Org  string | 
|  | Slug string | 
|  | } | 
|  |  | 
|  | func CreatePipelineID(value string) (*PipelineID, error) { | 
|  | parts := strings.Split(value, "/") | 
|  | if len(parts) != 2 { | 
|  | return nil, fmt.Errorf("Invalid pipeline ID '%s'. Pipelines must be specified as 'org_slug/pipeline_slug'.", value) | 
|  | } | 
|  | return &PipelineID{Org: parts[0], Slug: parts[1]}, nil | 
|  | } | 
|  |  | 
|  | func (pid *PipelineID) String() string { | 
|  | return fmt.Sprintf("%s/%s", pid.Org, pid.Slug) | 
|  | } |