goa_model_gen 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0cef817b3a53794219db9757fa0afe0aa7a288a6bd4b3bce8048ce14a8cb45c6
4
- data.tar.gz: 7bc9fdb4fe7722865fa6edd81d5716a1e3f00a1d62d447ca3f292eccc271a471
3
+ metadata.gz: 55c211e5cded1ceaad2db67152473f68f80db81ee97d83f8ea453ce08ee07cf8
4
+ data.tar.gz: 2a752f9dcd6daa746f7e8364ca9ca972e73a78e8dfd497eb08783da6ebb8ecc8
5
5
  SHA512:
6
- metadata.gz: cb69b2304c295fd3419b295b5880b741ea3f74aa78ac04a80cb44b4903b08839c7f3f6741b90c9f0a3d6f2c7df3e2e0bd3bba5a2b07ed29d064dc84d7fd7174b
7
- data.tar.gz: 2ad75dccfe25fdb3192ba38e3f16ea211f0b0d12ba84c233a219934139373d7d6e11b253cd0685544ebcfe297899ac56a4fe63e6be4d34fddd9daceaa6fac934
6
+ metadata.gz: 7197c6ef9959172c9d32f533fe8cacd72ed94f1b9f5a7eacbbed21622e39a5226cd9a2a765f25bed15e206cba6b8bb85a3e93e519596d6f667d7c22d9c5ada6a
7
+ data.tar.gz: bc4dfd74fd8cc1b0d7362218da8e51039614dcc008b074d95fab2fc5e6214f629be95a5917f3660621f655b65dbd864b50b0d58779345b18240d8e40a46fbde3
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require 'goa_model_gen'
2
3
  require 'goa_model_gen/goa'
3
4
 
@@ -21,7 +22,7 @@ module GoaModelGen
21
22
  end
22
23
 
23
24
  # https://goa.design/design/overview/
24
- PRIMITIVE_TYPES = %q[bool int int64 float string time.Time uuid.UUID interface{}]
25
+ PRIMITIVE_TYPES = %w[bool int int64 float string time.Time uuid.UUID *datastore.Key]
25
26
 
26
27
  def goa_name
27
28
  Goa.capitalize_join(name.split("_"))
@@ -78,8 +79,80 @@ module GoaModelGen
78
79
 
79
80
  def golang_type
80
81
  format2type = SWAGGER_TYPE_TO_GOLANG_TYPE[type]
81
- raise "Golang type not found for #{type}" unless format2type
82
+ raise "Golang type not found for #{self.inspect}" unless format2type
82
83
  return format2type[format]
83
84
  end
85
+
86
+ def conv_func_part_for_model
87
+ conv_func_part_for(type, !!(/\A\*/ =~ type))
88
+ end
89
+
90
+ def conv_func_part_for_payload
91
+ conv_func_part_for(golang_type, nullable?)
92
+ end
93
+
94
+ def conv_func_part_for_media_type
95
+ conv_func_part_for(golang_type, nullable?)
96
+ end
97
+
98
+ def conv_func_part_for(value, with_pointer)
99
+ r = value.sub(/\A\*/, '').split('.').map(&:camelize).join
100
+ with_pointer ? "#{r}Pointer" : r
101
+ end
102
+
103
+ def payload_assignment_options(f)
104
+ if custom?
105
+ if type_obj && type_obj.base
106
+ if f.not_null?
107
+ return false, false, type # 型キャスト
108
+ else
109
+ st = f.golang_type.camelize
110
+ dt = type_obj.base.camelize
111
+ return false, false, ["#{st}PointerTo#{dt}", type] # ポインタを値にしてから型キャスト
112
+ end
113
+ else
114
+ return false, true, "#{type}PayloadToModel"
115
+ end
116
+ else
117
+ if type == f.golang_type
118
+ if f.not_null?
119
+ return true, nil, nil
120
+ else
121
+ return false, false, "#{f.conv_func_part_for_payload}To#{conv_func_part_for_model}"
122
+ end
123
+ else
124
+ with_error = (f.type == 'string')
125
+ return false, with_error, "#{f.conv_func_part_for_payload}To#{conv_func_part_for_model}"
126
+ end
127
+ end
128
+ end
129
+
130
+ def media_type_assignment_options(f)
131
+ if custom?
132
+ if type_obj && type_obj.base
133
+ if f.not_null?
134
+ return false, false, type_obj.base # 型キャスト
135
+ else
136
+ st = type_obj.base.camelize
137
+ dt = f.golang_type.camelize
138
+ return false, false, [type_obj.base, "#{st}To#{dt}Pointer"] # 型キャストしてポインタを値に変換
139
+ end
140
+ else
141
+ return false, true, "#{type}ModelToMediaType"
142
+ end
143
+ else
144
+ if type == f.golang_type
145
+ if f.not_null?
146
+ return true, nil, nil
147
+ else
148
+ return false, false, "#{conv_func_part_for_model}To#{f.conv_func_part_for_payload}"
149
+ end
150
+ else
151
+ with_error = (type == 'string')
152
+ return false, with_error, "#{conv_func_part_for_model}To#{f.conv_func_part_for_payload}"
153
+ end
154
+ end
155
+ end
156
+
84
157
  end
85
158
  end
@@ -1,3 +1,12 @@
1
+ <%-
2
+ def method_calling_exp(m, argument)
3
+ if m.is_a?(Array)
4
+ m.reverse.join('(') + argument + (')' * m.length)
5
+ else
6
+ "#{m}(#{argument})"
7
+ end
8
+ end
9
+ -%>
1
10
  package controller
2
11
 
3
12
  import (
@@ -7,71 +16,86 @@ import (
7
16
 
8
17
  <%- types.select(&:gen_converter?).each do |type| -%>
9
18
  <%- if type.payload -%>
10
- func <%= type.name %>PayloadToModel(src *app.<%= type.payload_name %>) model.<%= type.name %> {
11
- if src == nil {
12
- return model.<%= type.name %>{}
19
+ func <%= type.name %>PayloadToModel(payload *app.<%= type.payload_name %>) (*model.<%= type.name %>, error) {
20
+ model := &model.<%= type.name %>{}
21
+ if err := CopyFrom<%= type.name %>PayloadToModel(payload, model); err != nil {
22
+ return nil, err
13
23
  }
14
- return model.<%= type.name %>{
15
- <%-
16
- comments = []
24
+ return model, nil
25
+ }
26
+
27
+ func CopyFrom<%= type.name %>PayloadToModel(payload *app.<%= type.payload_name %>, model *model.<%= type.name %>) error {
28
+ if payload == nil {
29
+ return NoPayloadGiven
30
+ }
31
+ if model == nil {
32
+ return NoModelGiven
33
+ }
17
34
 
35
+ <%-
18
36
  type.fields_including_id.each do |f|
19
37
  pf = type.payload.fields.detect{|pf| f.name.underscore == pf.name }
20
38
  if pf.nil?
21
- comments << "#{f.name} no payload field"
22
- elsif f.custom?
23
39
  -%>
24
- <%= f.name %>: <%= f.type %>PayloadToModel(src.<%= f.name %>),
25
- <%- elsif pf.nullable? -%>
26
- <%= f.name %>: <%= f.type.camelize %>PointerTo<%= f.type.camelize %>(src.<%= f.name %>),
27
- <%- else -%>
28
- <%= f.name %>: src.<%= f.name %>,
40
+ // <%= f.name %> not found in payload fields
41
+ <%-
42
+ else
43
+ simple, with_error, method_name = f.payload_assignment_options(pf)
44
+ -%>
45
+ <%- if simple -%>
46
+ model.<%= f.name %> = payload.<%= f.name %>
47
+ <%- elsif !with_error -%>
48
+ model.<%= f.name %> = <%= method_calling_exp(method_name, "payload.#{f.name}") %>
49
+ <%- else -%>
50
+ if v, err := <%= method_calling_exp(method_name, "payload.#{f.name}") %>; err != nil {
51
+ return err
52
+ } else {
53
+ model.<%= f.name %> = v
54
+ }
55
+ <%- end -%>
29
56
  <%- end -%>
30
57
  <%- end -%>
31
- <%- comments.each do |comment| -%>
32
- // <%= comment %>
33
- <%- end -%>
34
- <%- type.payload.field_diffs(type.fields.map{|f| f.name.underscore}).each do |pf| -%>
35
- // No model field for payload field "<%= pf.name %>"
58
+ <%- type.payload.field_diffs(type.fields_including_id.map{|f| f.name.underscore}).each do |pf| -%>
59
+ // No model field for payload field "<%= pf.name %>"
36
60
  <%- end -%>
37
- }
61
+ return nil
38
62
  }
39
63
 
40
64
  <%- end -%>
41
65
  <%- if type.media_type -%>
42
- func <%= type.name %>ModelToMediaType(src *model.<%= type.name %>) *app.<%= type.media_type_name_for_go %> {
43
- if src == nil {
44
- return nil
45
- }
46
- return &app.<%= type.media_type_name_for_go %>{
47
- <%-
48
- comments = []
66
+ func <%= type.name %>ModelToMediaType(model *model.<%= type.name %>) (*app.<%= type.media_type_name_for_go %>, error) {
67
+ if model == nil {
68
+ return nil, NoModelGiven
69
+ }
70
+ r := &app.<%= type.media_type_name_for_go %>{}
49
71
 
72
+ <%-
50
73
  type.fields_including_id.each do |f|
51
- mf = type.media_type.fields.detect{|mf| f.name == mf.name.camelize }
74
+ mf = type.media_type.fields.detect{|mf| f.name.underscore == mf.name }
52
75
  if mf.nil?
53
- comments << "#{f.name} no media type field"
54
- elsif f.custom?
55
- if f.type_obj && f.type_obj.base -%>
56
- <%= mf.goa_name %>: <%= f.type_obj.base %>(src.<%= f.name %>),
76
+ -%>
77
+ // <%= f.name %> not found for media type field
78
+ <%-
79
+ else
80
+ simple, with_error, method_name = f.media_type_assignment_options(mf)
81
+ -%>
82
+ <%- if simple -%>
83
+ r.<%= mf.goa_name %> = model.<%= f.name %>
84
+ <%- elsif !with_error -%>
85
+ r.<%= mf.goa_name %> = <%= method_calling_exp(method_name, "model.#{f.name}") %>
57
86
  <%- else -%>
58
- <%= mf.goa_name %>: <%= f.type %>ModelToMediaType(&src.<%= f.name %>),
87
+ if val, err := <%= method_calling_exp(method_name, "model.#{f.name}") %>; err != nil {
88
+ return nil, err
89
+ } else {
90
+ r.<%= mf.goa_name %> = val
91
+ }
59
92
  <%- end
60
- else -%>
61
- <%- if mf.golang_type == f.type -%>
62
- <%= mf.goa_name %>: <%= mf.nullable? ? '&' : '' %>src.<%= f.name %>,
63
- <%- else -%>
64
- <%= mf.goa_name %>: <%= f.type.camelize %>To<%= mf.golang_type.camelize %><%= mf.nullable? ? 'Pointer' : '' %>(src.<%= f.name %>),
65
- <%- end -%>
66
- <%- end -%>
67
- <%- end -%>
68
- <%- comments.each do |comment| -%>
69
- // <%= comment %>
93
+ end -%>
70
94
  <%- end -%>
71
- <%- type.media_type.field_diffs(type.fields.map{|f| f.name.underscore}).each do |mf| -%>
72
- // No field for media type field "<%= mf.name %>"
95
+ <%- type.media_type.field_diffs(type.fields_including_id.map{|f| f.name.underscore}).each do |mf| -%>
96
+ // No model field for media type field "<%= mf.name %>"
73
97
  <%- end -%>
74
- }
98
+ return r, nil
75
99
  }
76
100
 
77
101
  <%- end -%>
@@ -1,9 +1,16 @@
1
1
  package controller
2
2
 
3
3
  import (
4
+ "fmt"
4
5
  "strconv"
6
+
7
+ "google.golang.org/appengine/datastore"
5
8
  )
6
9
 
10
+ var NoModelGiven = fmt.Errorf("No model given")
11
+ var NoPayloadGiven = fmt.Errorf("No payload given")
12
+ var NoMediaTypeGiven = fmt.Errorf("No media type given")
13
+
7
14
  func BoolPointerToBool(v *bool) bool {
8
15
  return BoolPointerToBoolWith(v, false)
9
16
  }
@@ -58,3 +65,29 @@ func Int64ToStringPointer(v int64) *string {
58
65
  s := Int64ToString(v)
59
66
  return &s
60
67
  }
68
+
69
+ func StringToDatastoreKeyPointer(v string) (*datastore.Key, error) {
70
+ return datastore.DecodeKey(v)
71
+ }
72
+
73
+ func StringPointerToDatastoreKeyPointer(v *string) (*datastore.Key, error) {
74
+ if v == nil {
75
+ return nil, nil
76
+ }
77
+ return StringToDatastoreKeyPointer(*v)
78
+ }
79
+
80
+ func DatastoreKeyPointerToString(key *datastore.Key) string {
81
+ if key == nil {
82
+ return ""
83
+ }
84
+ return key.Encode()
85
+ }
86
+
87
+ func DatastoreKeyPointerToStringPointer(key *datastore.Key) *string {
88
+ if key == nil {
89
+ return nil
90
+ }
91
+ s := DatastoreKeyPointerToString(key)
92
+ return &s
93
+ }
@@ -1,3 +1,3 @@
1
1
  module GoaModelGen
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: goa_model_gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - akm
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-21 00:00:00.000000000 Z
11
+ date: 2018-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor