package handler
import (
"fmt"
"strconv"
"strings"
apimodel "github.com/goodrain/rainbond/api/model"
"github.com/sirupsen/logrus"
)
type RootAction struct{}
func CreateRootFuncManager() *RootAction {
return &RootAction{}
}
type VersionInfo struct {
Version []*LangInfo `json:"version"`
}
type LangInfo struct {
Lang string `json:"lang"`
Major []*MajorInfo
}
type MajorInfo struct {
Major int `json:"major"`
Minor []*MinorInfo
}
type MinorInfo struct {
Minor int `json:"minor"`
Patch []int `json:"patch"`
}
func (r *RootAction) ResolvePHP(cs *apimodel.ComposerStruct) (string, error) {
lang := cs.Body.Lang
data := cs.Body.Data
logrus.Debugf("Composer got default_runtime=%v, json body=%v", lang, data)
jsonData := cs.Body.Data.JSON
if cs.Body.Data.JSON.PlatForm.PHP == "" {
jsonData = cs.Body.Data.Lock
}
listVersions, err := createListVersion(cs)
if err != nil {
return "", err
}
isphp := jsonData.PlatForm.PHP
if isphp != "" {
var maxVersion string
var errV error
if strings.HasPrefix(isphp, "~") {
si := strings.Split(isphp, "~")
mm := strings.Split(si[1], ".")
major, minor, _, err := transAtoi(mm)
if err != nil {
return "", err
}
maxVersion, errV = getMaxVersion(lang, &listVersions, major, minor)
if errV != nil {
return "", errV
}
} else if strings.HasPrefix(isphp, ">=") {
si := strings.Split(isphp, ">=")
mm := strings.Split(si[1], ".")
major, minor, _, err := transAtoi(mm)
if err != nil {
return "", err
}
maxVersion, errV = getMaxVersion(lang, &listVersions, major, minor)
if errV != nil {
return "", errV
}
} else {
mm := strings.Split(isphp, ".")
major, minor, patch, err := transAtoi(mm)
if err != nil {
return "", err
}
maxVersion, errV = getMaxVersion(lang, &listVersions, major, minor, patch)
if errV != nil {
return "", errV
}
}
return fmt.Sprintf("{%s|composer.json|%s|%s", lang, isphp, maxVersion), nil
}
maxVersion, errM := getMaxVersion(lang, &listVersions)
if errM != nil {
return "", errM
}
return fmt.Sprintf("{%s|default|*|%s}", lang, maxVersion), nil
}
func createListVersion(cs *apimodel.ComposerStruct) (map[string]*VersionInfo, error) {
listVersions := make(map[string]interface{})
var vi VersionInfo
for _, p := range cs.Body.Data.Packages {
mm := strings.Split(p, "-")
name := mm[0]
version := mm[1]
var li LangInfo
mp := strings.Split(version, ".")
major, minor, patch, errT := transAtoi(mp)
if errT != nil {
return nil, errT
}
if _, ok := listVersions[name]; !ok {
var nn VersionInfo
listVersions[name] = &nn
}
mp := strings.Split(version, ".")
major, minor, patch, errT := transAtoi(mp)
if errT != nil {
return nil, errT
}
listVersions[name].Majon = major
listVersions[name].Minor = minor
listVersions[name].Patch = patch
}*/
return nil, nil
}
func transAtoi(mm []string) (int, int, int, error) {
major, minor, patch := 0, 0, 0
major, errMa := strconv.Atoi(mm[0])
if errMa != nil {
return 0, 0, 0, errMa
}
minor, errMi := strconv.Atoi(mm[1])
if errMi != nil {
return 0, 0, 0, errMi
}
if len(mm) == 3 {
var err error
patch, err = strconv.Atoi(mm[2])
if err != nil {
return 0, 0, 0, err
}
} else if len(mm) == 2 {
patch = 0
} else {
return 0, 0, 0, fmt.Errorf("version length error")
}
return major, minor, patch, nil
}
func getMaxVersion(l string, lv *map[string]*VersionInfo, opts ...int) (string, error) {
return "", nil
}