3232class
3333 EG_SPREADSHEET
3434
35- inherit
36- ANY
37- redefine
38- default_create
39- end
40-
41- create
42- default_create
43-
44- feature -- {NONE}
45-
46- default_create
47- do
48- create id .make_empty
49- create url .make_empty
50- create properties
51- create {ARRAYED_LIST [EG_SHEET ]} sheets .make (0 )
52- create {ARRAYED_LIST [EG_NAMED_RANGE ]} named_ranges .make (0 )
53- create {ARRAYED_LIST [EG_DEVELOPER_METADATA ]} developer_metadata .make (0 )
54- ensure then
55- id_set : id .is_empty
56- url_set : url .is_empty
57- end
58-
5935feature -- Access
6036
61- id : IMMUTABLE_STRING_ 8
37+ id : detachable IMMUTABLE_STRING_ 8
6238 -- The ID of the spreadsheet. This field is read-only.
6339
64- properties : EG_SPREADSHEET_PROPERTIES
40+ properties : detachable EG_SPREADSHEET_PROPERTIES
6541 -- Overall properties of a spreadsheet.
6642
67- sheets : LIST [EG_SHEET ]
43+ sheets : detachable LIST [EG_SHEET ]
6844 -- The sheets that are part of a spreadsheet.
6945
70- named_ranges : LIST [EG_NAMED_RANGE ]
46+ named_ranges : detachable LIST [EG_NAMED_RANGE ]
7147 -- The named ranges defined in a spreadsheet.
7248
73- url : IMMUTABLE_STRING_ 8
49+ url : detachable IMMUTABLE_STRING_ 8
7450 -- The url of the spreadsheet. This field is read-only.
7551
76- developer_metadata : LIST [EG_DEVELOPER_METADATA ]
52+ developer_metadata : detachable LIST [EG_DEVELOPER_METADATA ]
7753 -- The developer metadata associated with a spreadsheet.
7854
7955
@@ -97,11 +73,21 @@ feature -- Change Element
9773
9874 force_sheet (a_sheet : EG_SHEET )
9975 -- Add a sheet `a_sheet` to the list of sheets.
76+ local
77+ l_sheets : like sheets
10078 do
101- sheets .force (a_sheet )
79+ l_sheets := sheets
80+ if l_sheets /= Void then
81+ l_sheets .force (a_sheet )
82+ else
83+ create {ARRAYED_LIST [EG_SHEET ]} l_sheets .make (2 )
84+ l_sheets .force (a_sheet )
85+ end
86+ sheets := l_sheets
10287 end
10388
10489 set_sheets (a_sheets : like sheets )
90+ -- Set the list of `sheets` with `a_sheets`.
10591 do
10692 sheets := a_sheets
10793 ensure
@@ -110,11 +96,21 @@ feature -- Change Element
11096
11197 force_name_range (a_range : EG_NAMED_RANGE )
11298 -- Add a range `a_range` to the list of ranges.
99+ local
100+ l_named_ranges : like named_ranges
113101 do
114- named_ranges .force (a_range )
102+ l_named_ranges := named_ranges
103+ if l_named_ranges /= Void then
104+ l_named_ranges .force (a_range )
105+ else
106+ create {ARRAYED_LIST [EG_NAMED_RANGE ]} l_named_ranges .make (2 )
107+ l_named_ranges .force (a_range )
108+ end
109+ named_ranges := l_named_ranges
115110 end
116111
117112 set_named_ranges (a_named_ranges : like named_ranges )
113+ -- Set the list `named_ranges` with `a_named_ranges`.
118114 do
119115 named_ranges := a_named_ranges
120116 ensure
@@ -123,11 +119,21 @@ feature -- Change Element
123119
124120 force_developer_metadata (a_metadata : EG_DEVELOPER_METADATA )
125121 -- Set developer metadata `a_metadata` to metadata.
122+ local
123+ l_developer_metadata : like developer_metadata
126124 do
127- developer_metadata .force (a_metadata )
125+ l_developer_metadata := developer_metadata
126+ if l_developer_metadata /= Void then
127+ l_developer_metadata .force (a_metadata )
128+ else
129+ create {ARRAYED_LIST [EG_DEVELOPER_METADATA ]} l_developer_metadata .make (2 )
130+ l_developer_metadata .force (a_metadata )
131+ end
132+ developer_metadata := l_developer_metadata
128133 end
129134
130135 set_developer_metadata (a_metadata : like developer_metadata )
136+ -- Set the list `developer_metadata` with `a_metadata`.
131137 do
132138 developer_metadata := a_metadata
133139 ensure
@@ -145,7 +151,7 @@ feature {EG_SHEETS_JSON} -- Factory
145151 create id .make_from_string (a_id )
146152 ensure
147153 is_id_set : is_id_set
148- id_set : id .is_case_insensitive_equal (a_id )
154+ id_set : attached id as l_id and then l_id .is_case_insensitive_equal (a_id )
149155 end
150156
151157 set_url (a_url : STRING )
@@ -156,23 +162,48 @@ feature {EG_SHEETS_JSON} -- Factory
156162 is_url_set := True
157163 create url .make_from_string (a_url )
158164 ensure
159- url_set : url .is_case_insensitive_equal (a_url )
165+ url_set : attached url as l_url and then l_url .is_case_insensitive_equal (a_url )
160166 is_url_set : is_url_set
161167 end
162168
163169feature -- Eiffel to JSON
164170
165171 to_json : JSON_OBJECT
166172 -- Json representation of the Current object.
173+ local
174+ l_array : JSON_ARRAY
167175 do
168176 create Result .make_with_capacity (2 )
169- Result .put (create {JSON_STRING }.make_from_string (id ), " spreadsheetId" )
170- Result .put (properties .to_json , " properties" )
171- -- properties JSON_OBJECT
172- -- sheets JSON_ARRAY
173- -- namedRanges : JSON_ARRAY
174- Result .put (create {JSON_STRING }.make_from_string (url ), " spreadsheetUrl" )
175- -- developerMetadata JSON_ARRAY
177+ if attached id as l_id then
178+ Result .put (create {JSON_STRING }.make_from_string (l_id ), " spreadsheetId" )
179+ end
180+ if attached properties as l_properties then
181+ Result .put (l_properties .to_json , " properties" )
182+ end
183+ if attached sheets as l_sheets then
184+ create l_array .make (l_sheets .count )
185+ across l_sheets as ic loop
186+ l_array .add (ic .item .to_json )
187+ end
188+ Result .put (l_array , " sheets" )
189+ end
190+ if attached named_ranges as l_named_ranges then
191+ create l_array .make (l_named_ranges .count )
192+ across l_named_ranges as ic loop
193+ l_array .add (ic .item .to_json )
194+ end
195+ Result .put (l_array , " namedRanges" )
196+ end
197+ if attached url as l_url then
198+ Result .put (create {JSON_STRING }.make_from_string (l_url ), " spreadsheetUrl" )
199+ end
200+ if attached developer_metadata as l_developer_metadata then
201+ create l_array .make (l_developer_metadata .count )
202+ across l_developer_metadata as ic loop
203+ l_array .add (ic .item .to_json )
204+ end
205+ Result .put (l_array , " developerMetadata" )
206+ end
176207 end
177208
178209
0 commit comments