// Copyright 2020 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package build

// A File represents a file that is part of the build process.
type File struct {
	Filename string `json:"filename"`

	Encoding       Encoding          `json:"encoding,omitempty"`
	Interpretation Interpretation    `json:"interpretation,omitempty"`
	Form           Form              `json:"form,omitempty"`
	Tags           map[string]string `json:"tags,omitempty"` // code=go

	Source interface{} `json:"-"` // TODO: swap out with concrete type.
}

// A Encoding indicates a file format for representing a program.
type Encoding string

const (
	CUE      Encoding = "cue"
	JSON     Encoding = "json"
	YAML     Encoding = "yaml"
	JSONL    Encoding = "jsonl"
	Text     Encoding = "text"
	Protobuf Encoding = "proto"

	// TODO:
	// TOML
	// TextProto
	// BinProto

	Code Encoding = "code" // Programming languages
)

// An Interpretation determines how a certain program should be interpreted.
// For instance, data may be interpreted as describing a schema, which itself
// can be converted to a CUE schema.
type Interpretation string

const (
	JSONSchema Interpretation = "jsonschema"
	OpenAPI    Interpretation = "openapi"
)

// A Form specifies the form in which a program should be represented.
type Form string

const (
	Full   Form = "full"
	Schema Form = "schema"
	Struct Form = "struct"
	Final  Form = "final" // picking default values, may be non-concrete
	Graph  Form = "graph" // Data only, but allow references
	DAG    Form = "dag"   // Like graph, but don't allow cycles
	Data   Form = "data"  // always final
)
