github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/unstructured/config_object.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package unstructured 21 22 import ( 23 "fmt" 24 "sync" 25 26 appsv1alpha1 "github.com/1aal/kubeblocks/apis/apps/v1alpha1" 27 ) 28 29 type ConfigObjectCreator = func(name string) ConfigObject 30 31 type ConfigObjectRegistry struct { 32 objectCreator map[appsv1alpha1.CfgFileFormat]ConfigObjectCreator 33 } 34 35 var ( 36 ConfigRegistryOnce sync.Once 37 configObjectRegistry *ConfigObjectRegistry 38 ) 39 40 func CfgObjectRegistry() *ConfigObjectRegistry { 41 ConfigRegistryOnce.Do(func() { 42 configObjectRegistry = &ConfigObjectRegistry{objectCreator: make(map[appsv1alpha1.CfgFileFormat]ConfigObjectCreator)} 43 }) 44 return configObjectRegistry 45 } 46 47 func (c *ConfigObjectRegistry) RegisterConfigCreator(format appsv1alpha1.CfgFileFormat, creator ConfigObjectCreator) { 48 c.objectCreator[format] = creator 49 } 50 51 func (c *ConfigObjectRegistry) GetConfigObject(name string, format appsv1alpha1.CfgFileFormat) (ConfigObject, error) { 52 creator, ok := c.objectCreator[format] 53 if !ok { 54 return nil, fmt.Errorf("not supported type[%s]", format) 55 } 56 return creator(name), nil 57 } 58 59 func LoadConfig(name string, content string, format appsv1alpha1.CfgFileFormat) (ConfigObject, error) { 60 configObject, err := CfgObjectRegistry().GetConfigObject(name, format) 61 if err != nil { 62 return nil, err 63 } 64 if err := configObject.Unmarshal(content); err != nil { 65 return nil, err 66 } 67 return configObject, nil 68 }