gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/modifyx/modify-object.go (about) 1 package modifyx 2 3 import ( 4 "gitee.com/zhongguo168a/gocodes/datax/convertx" 5 ) 6 7 // 新建一个对象 8 func NewObject(root *Root) (obj *Object) { 9 obj = newObject() 10 obj.root = root 11 return 12 } 13 14 func newObject() (obj *Object) { 15 obj = &Object{} 16 obj.temps = map[string]interface{}{} 17 return 18 } 19 20 // 修正对象 21 // 如果需要在运行时,替换源的数据,可通过设置runtime实现 22 type Object struct { 23 root *Root 24 // 字段的路径 25 path string 26 // 在父对象中的字段名字 27 field string 28 // 缓存的map/array/struct等对象, 避免重复创建对象 29 temps map[string]interface{} 30 // 31 creators map[string]func(obj IObject) IObject 32 creator func(obj IObject) IObject 33 } 34 35 func (s *Object) RefClassCreator(field string, creator func(object IObject) IObject) { 36 if s.creators == nil { 37 s.creators = map[string]func(obj IObject) IObject{} 38 } 39 s.creators[field] = creator 40 } 41 42 func (s *Object) RefOriginBool(field string) bool { 43 return convertx.AnyToBool(s.root.source.GetOrigin(s.path + "/" + field)) 44 } 45 46 func (s *Object) RefOriginFloat(field string) float64 { 47 return convertx.AnyToFloat64(s.root.source.GetOrigin(s.path + "/" + field)) 48 } 49 func (s *Object) RefOriginInt(field string) int { 50 return convertx.AnyToInt(s.root.source.GetOrigin(s.path + "/" + field)) 51 } 52 53 func (s *Object) RefAnyType() string { 54 return convertx.AnyToString(s.root.source.GetOrigin(s.path + "/_type")) 55 } 56 57 func (s *Object) Dispose() { 58 s.temps = nil 59 s.root = nil 60 } 61 62 // 修正后的整型 63 func (s *Object) RefInt(field string) int { 64 root := s.root 65 return convertx.AnyToInt(root.source.Get(root.ctx, s.path+"/"+field)) 66 67 } 68 69 // 修正后的整型 70 func (s *Object) RefBool(field string) bool { 71 root := s.root 72 return convertx.AnyToBool(root.source.Get(root.ctx, s.path+"/"+field)) 73 } 74 75 // 修正后的浮点型 76 func (s *Object) RefFloat64(field string) float64 { 77 root := s.root 78 return convertx.AnyToFloat64(root.source.Get(root.ctx, s.path+"/"+field)) 79 80 } 81 82 // 获取原始数据指定的字段 83 func (s *Object) RefOrigin(field string) interface{} { 84 return s.root.source.GetOrigin(field) 85 } 86 87 func (s *Object) RefUint(field string) (val uint) { 88 return uint(s.RefInt(field)) 89 } 90 91 func (s *Object) RefString(field string) (val string) { 92 root := s.root 93 return convertx.AnyToString(root.source.Get(root.ctx, s.path+"/"+field)) 94 } 95 func (s *Object) RefAny(field string) (val interface{}) { 96 return s.RefObject(field) 97 } 98 func (s *Object) RefArray(field string) (r IArray) { 99 iobj, hastemp := s.temps[field] 100 if hastemp == false { 101 obj := newArray() 102 obj.root = s.root 103 obj.path = s.path + "/" + field 104 obj.creator = s.creators[field] 105 // 106 iobj = obj 107 s.temps[field] = iobj 108 } 109 110 r = iobj.(IArray) 111 return 112 } 113 114 func (s *Object) RefMap(field string) (r IObject) { 115 iobj, hastemp := s.temps[field] 116 if hastemp == false { 117 obj := newObject() 118 obj.root = s.root 119 obj.field = field 120 obj.path = s.path + "/" + field 121 obj.temps = map[string]interface{}{} 122 // 123 creator, hascreator := s.creators[field] 124 if hascreator { 125 obj.creator = creator 126 } 127 iobj = obj 128 s.temps[field] = iobj 129 } 130 131 r = iobj.(IObject) 132 return 133 } 134 135 func (s *Object) RefObject(field string) (r IObject) { 136 iobj, hastemp := s.temps[field] 137 if hastemp == false { 138 obj := newObject() 139 obj.root = s.root 140 obj.field = field 141 obj.path = s.path + "/" + field 142 obj.temps = map[string]interface{}{} 143 144 if s.creator != nil { // 只有map对象会有此属性 145 iobj = s.creator(obj) 146 } else { 147 // 148 creator, hascreator := s.creators[field] 149 if !hascreator { 150 if obj.RefAnyType() != "" { 151 creator = getType(obj.RefAnyType()) 152 if creator != nil { 153 iobj = creator(obj) 154 } else { 155 iobj = obj 156 } 157 } else { 158 iobj = obj 159 } 160 } else { 161 iobj = creator(obj) 162 } 163 } 164 165 s.temps[field] = iobj 166 } 167 168 r = iobj.(IObject) 169 return 170 } 171 172 func (s *Object) RefIsNil() bool { 173 source := s.root.source 174 return source.IsNil(s.path) 175 } 176 177 func (s *Object) RefLength() int { 178 source := s.root.source 179 return source.Length(s.path) 180 } 181 182 func (s *Object) RefKeys() (r []string) { 183 if s.RefIsNil() { 184 return 185 } 186 187 source := s.root.source 188 return source.MapKeys(s.path) 189 }