k8s.io/kube-openapi@v0.0.0-20240228011516-70dd3763d340/pkg/internal/third_party/go-json-experiment/json/testdata_test.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package json 6 7 import ( 8 "bytes" 9 "compress/gzip" 10 "io/ioutil" 11 "os" 12 "path/filepath" 13 "sort" 14 "strings" 15 "sync" 16 "testing" 17 "time" 18 ) 19 20 type jsonTestdataEntry struct { 21 name string 22 data []byte 23 new func() any // nil if there is no concrete type for this 24 } 25 26 var ( 27 jsonTestdataOnce sync.Once 28 jsonTestdataLazy []jsonTestdataEntry 29 ) 30 31 func jsonTestdata() []jsonTestdataEntry { 32 jsonTestdataOnce.Do(func() { 33 fis, err := ioutil.ReadDir("testdata") 34 if err != nil { 35 panic(err) 36 } 37 sort.Slice(fis, func(i, j int) bool { return fis[i].Name() < fis[j].Name() }) 38 for _, fi := range fis { 39 if !strings.HasSuffix(fi.Name(), ".json.gz") { 40 break 41 } 42 43 // Skip large files for a short test run. 44 if testing.Short() { 45 fi, err := os.Stat(filepath.Join("testdata", fi.Name())) 46 if err == nil && fi.Size() > 1e3 { 47 continue 48 } 49 } 50 51 // Convert snake_case file name to CamelCase. 52 words := strings.Split(strings.TrimSuffix(fi.Name(), ".json.gz"), "_") 53 for i := range words { 54 words[i] = strings.Title(words[i]) 55 } 56 name := strings.Join(words, "") 57 58 // Read and decompress the test data. 59 b, err := ioutil.ReadFile(filepath.Join("testdata", fi.Name())) 60 if err != nil { 61 panic(err) 62 } 63 zr, err := gzip.NewReader(bytes.NewReader(b)) 64 if err != nil { 65 panic(err) 66 } 67 data, err := ioutil.ReadAll(zr) 68 if err != nil { 69 panic(err) 70 } 71 72 // Check whether there is a concrete type for this data. 73 var newFn func() any 74 switch name { 75 case "CanadaGeometry": 76 newFn = func() any { return new(canadaRoot) } 77 case "CitmCatalog": 78 newFn = func() any { return new(citmRoot) } 79 case "GolangSource": 80 newFn = func() any { return new(golangRoot) } 81 case "StringEscaped": 82 newFn = func() any { return new(stringRoot) } 83 case "StringUnicode": 84 newFn = func() any { return new(stringRoot) } 85 case "SyntheaFhir": 86 newFn = func() any { return new(syntheaRoot) } 87 case "TwitterStatus": 88 newFn = func() any { return new(twitterRoot) } 89 } 90 91 jsonTestdataLazy = append(jsonTestdataLazy, jsonTestdataEntry{name, data, newFn}) 92 } 93 }) 94 return jsonTestdataLazy 95 } 96 97 type ( 98 canadaRoot struct { 99 Type string `json:"type"` 100 Features []struct { 101 Type string `json:"type"` 102 Properties struct { 103 Name string `json:"name"` 104 } `json:"properties"` 105 Geometry struct { 106 Type string `json:"type"` 107 Coordinates [][][2]float64 `json:"coordinates"` 108 } `json:"geometry"` 109 } `json:"features"` 110 } 111 ) 112 113 type ( 114 citmRoot struct { 115 AreaNames map[int64]string `json:"areaNames"` 116 AudienceSubCategoryNames map[int64]string `json:"audienceSubCategoryNames"` 117 BlockNames map[int64]string `json:"blockNames"` 118 Events map[int64]struct { 119 Description string `json:"description"` 120 ID int `json:"id"` 121 Logo string `json:"logo"` 122 Name string `json:"name"` 123 SubTopicIds []int `json:"subTopicIds"` 124 SubjectCode any `json:"subjectCode"` 125 Subtitle any `json:"subtitle"` 126 TopicIds []int `json:"topicIds"` 127 } `json:"events"` 128 Performances []struct { 129 EventID int `json:"eventId"` 130 ID int `json:"id"` 131 Logo any `json:"logo"` 132 Name any `json:"name"` 133 Prices []struct { 134 Amount int `json:"amount"` 135 AudienceSubCategoryID int64 `json:"audienceSubCategoryId"` 136 SeatCategoryID int64 `json:"seatCategoryId"` 137 } `json:"prices"` 138 SeatCategories []struct { 139 Areas []struct { 140 AreaID int `json:"areaId"` 141 BlockIds []any `json:"blockIds"` 142 } `json:"areas"` 143 SeatCategoryID int `json:"seatCategoryId"` 144 } `json:"seatCategories"` 145 SeatMapImage any `json:"seatMapImage"` 146 Start int64 `json:"start"` 147 VenueCode string `json:"venueCode"` 148 } `json:"performances"` 149 SeatCategoryNames map[uint64]string `json:"seatCategoryNames"` 150 SubTopicNames map[uint64]string `json:"subTopicNames"` 151 SubjectNames map[uint64]string `json:"subjectNames"` 152 TopicNames map[uint64]string `json:"topicNames"` 153 TopicSubTopics map[uint64][]uint64 `json:"topicSubTopics"` 154 VenueNames map[string]string `json:"venueNames"` 155 } 156 ) 157 158 type ( 159 golangRoot struct { 160 Tree *golangNode `json:"tree"` 161 Username string `json:"username"` 162 } 163 golangNode struct { 164 Name string `json:"name"` 165 Kids []golangNode `json:"kids"` 166 CLWeight float64 `json:"cl_weight"` 167 Touches int `json:"touches"` 168 MinT uint64 `json:"min_t"` 169 MaxT uint64 `json:"max_t"` 170 MeanT uint64 `json:"mean_t"` 171 } 172 ) 173 174 type ( 175 stringRoot struct { 176 Arabic string `json:"Arabic"` 177 ArabicPresentationFormsA string `json:"Arabic Presentation Forms-A"` 178 ArabicPresentationFormsB string `json:"Arabic Presentation Forms-B"` 179 Armenian string `json:"Armenian"` 180 Arrows string `json:"Arrows"` 181 Bengali string `json:"Bengali"` 182 Bopomofo string `json:"Bopomofo"` 183 BoxDrawing string `json:"Box Drawing"` 184 CJKCompatibility string `json:"CJK Compatibility"` 185 CJKCompatibilityForms string `json:"CJK Compatibility Forms"` 186 CJKCompatibilityIdeographs string `json:"CJK Compatibility Ideographs"` 187 CJKSymbolsAndPunctuation string `json:"CJK Symbols and Punctuation"` 188 CJKUnifiedIdeographs string `json:"CJK Unified Ideographs"` 189 CJKUnifiedIdeographsExtensionA string `json:"CJK Unified Ideographs Extension A"` 190 CJKUnifiedIdeographsExtensionB string `json:"CJK Unified Ideographs Extension B"` 191 Cherokee string `json:"Cherokee"` 192 CurrencySymbols string `json:"Currency Symbols"` 193 Cyrillic string `json:"Cyrillic"` 194 CyrillicSupplementary string `json:"Cyrillic Supplementary"` 195 Devanagari string `json:"Devanagari"` 196 EnclosedAlphanumerics string `json:"Enclosed Alphanumerics"` 197 EnclosedCJKLettersAndMonths string `json:"Enclosed CJK Letters and Months"` 198 Ethiopic string `json:"Ethiopic"` 199 GeometricShapes string `json:"Geometric Shapes"` 200 Georgian string `json:"Georgian"` 201 GreekAndCoptic string `json:"Greek and Coptic"` 202 Gujarati string `json:"Gujarati"` 203 Gurmukhi string `json:"Gurmukhi"` 204 HangulCompatibilityJamo string `json:"Hangul Compatibility Jamo"` 205 HangulJamo string `json:"Hangul Jamo"` 206 HangulSyllables string `json:"Hangul Syllables"` 207 Hebrew string `json:"Hebrew"` 208 Hiragana string `json:"Hiragana"` 209 IPAExtentions string `json:"IPA Extentions"` 210 KangxiRadicals string `json:"Kangxi Radicals"` 211 Katakana string `json:"Katakana"` 212 Khmer string `json:"Khmer"` 213 KhmerSymbols string `json:"Khmer Symbols"` 214 Latin string `json:"Latin"` 215 LatinExtendedAdditional string `json:"Latin Extended Additional"` 216 Latin1Supplement string `json:"Latin-1 Supplement"` 217 LatinExtendedA string `json:"Latin-Extended A"` 218 LatinExtendedB string `json:"Latin-Extended B"` 219 LetterlikeSymbols string `json:"Letterlike Symbols"` 220 Malayalam string `json:"Malayalam"` 221 MathematicalAlphanumericSymbols string `json:"Mathematical Alphanumeric Symbols"` 222 MathematicalOperators string `json:"Mathematical Operators"` 223 MiscellaneousSymbols string `json:"Miscellaneous Symbols"` 224 Mongolian string `json:"Mongolian"` 225 NumberForms string `json:"Number Forms"` 226 Oriya string `json:"Oriya"` 227 PhoneticExtensions string `json:"Phonetic Extensions"` 228 SupplementalArrowsB string `json:"Supplemental Arrows-B"` 229 Syriac string `json:"Syriac"` 230 Tamil string `json:"Tamil"` 231 Thaana string `json:"Thaana"` 232 Thai string `json:"Thai"` 233 UnifiedCanadianAboriginalSyllabics string `json:"Unified Canadian Aboriginal Syllabics"` 234 YiRadicals string `json:"Yi Radicals"` 235 YiSyllables string `json:"Yi Syllables"` 236 } 237 ) 238 239 type ( 240 syntheaRoot struct { 241 Entry []struct { 242 FullURL string `json:"fullUrl"` 243 Request *struct { 244 Method string `json:"method"` 245 URL string `json:"url"` 246 } `json:"request"` 247 Resource *struct { 248 AbatementDateTime time.Time `json:"abatementDateTime"` 249 AchievementStatus syntheaCode `json:"achievementStatus"` 250 Active bool `json:"active"` 251 Activity []struct { 252 Detail *struct { 253 Code syntheaCode `json:"code"` 254 Location syntheaReference `json:"location"` 255 Status string `json:"status"` 256 } `json:"detail"` 257 } `json:"activity"` 258 Address []syntheaAddress `json:"address"` 259 Addresses []syntheaReference `json:"addresses"` 260 AuthoredOn time.Time `json:"authoredOn"` 261 BillablePeriod syntheaRange `json:"billablePeriod"` 262 BirthDate string `json:"birthDate"` 263 CareTeam []struct { 264 Provider syntheaReference `json:"provider"` 265 Reference string `json:"reference"` 266 Role syntheaCode `json:"role"` 267 Sequence int64 `json:"sequence"` 268 } `json:"careTeam"` 269 Category []syntheaCode `json:"category"` 270 Claim syntheaReference `json:"claim"` 271 Class syntheaCoding `json:"class"` 272 ClinicalStatus syntheaCode `json:"clinicalStatus"` 273 Code syntheaCode `json:"code"` 274 Communication []struct { 275 Language syntheaCode `json:"language"` 276 } `json:"communication"` 277 Component []struct { 278 Code syntheaCode `json:"code"` 279 ValueQuantity syntheaCoding `json:"valueQuantity"` 280 } `json:"component"` 281 Contained []struct { 282 Beneficiary syntheaReference `json:"beneficiary"` 283 ID string `json:"id"` 284 Intent string `json:"intent"` 285 Payor []syntheaReference `json:"payor"` 286 Performer []syntheaReference `json:"performer"` 287 Requester syntheaReference `json:"requester"` 288 ResourceType string `json:"resourceType"` 289 Status string `json:"status"` 290 Subject syntheaReference `json:"subject"` 291 Type syntheaCode `json:"type"` 292 } `json:"contained"` 293 Created time.Time `json:"created"` 294 DeceasedDateTime time.Time `json:"deceasedDateTime"` 295 Description syntheaCode `json:"description"` 296 Diagnosis []struct { 297 DiagnosisReference syntheaReference `json:"diagnosisReference"` 298 Sequence int64 `json:"sequence"` 299 Type []syntheaCode `json:"type"` 300 } `json:"diagnosis"` 301 DosageInstruction []struct { 302 AsNeededBoolean bool `json:"asNeededBoolean"` 303 DoseAndRate []struct { 304 DoseQuantity *struct { 305 Value float64 `json:"value"` 306 } `json:"doseQuantity"` 307 Type syntheaCode `json:"type"` 308 } `json:"doseAndRate"` 309 Sequence int64 `json:"sequence"` 310 Timing *struct { 311 Repeat *struct { 312 Frequency int64 `json:"frequency"` 313 Period float64 `json:"period"` 314 PeriodUnit string `json:"periodUnit"` 315 } `json:"repeat"` 316 } `json:"timing"` 317 } `json:"dosageInstruction"` 318 EffectiveDateTime time.Time `json:"effectiveDateTime"` 319 Encounter syntheaReference `json:"encounter"` 320 Extension []syntheaExtension `json:"extension"` 321 Gender string `json:"gender"` 322 Goal []syntheaReference `json:"goal"` 323 ID string `json:"id"` 324 Identifier []struct { 325 System string `json:"system"` 326 Type syntheaCode `json:"type"` 327 Use string `json:"use"` 328 Value string `json:"value"` 329 } `json:"identifier"` 330 Insurance []struct { 331 Coverage syntheaReference `json:"coverage"` 332 Focal bool `json:"focal"` 333 Sequence int64 `json:"sequence"` 334 } `json:"insurance"` 335 Insurer syntheaReference `json:"insurer"` 336 Intent string `json:"intent"` 337 Issued time.Time `json:"issued"` 338 Item []struct { 339 Adjudication []struct { 340 Amount syntheaCurrency `json:"amount"` 341 Category syntheaCode `json:"category"` 342 } `json:"adjudication"` 343 Category syntheaCode `json:"category"` 344 DiagnosisSequence []int64 `json:"diagnosisSequence"` 345 Encounter []syntheaReference `json:"encounter"` 346 InformationSequence []int64 `json:"informationSequence"` 347 LocationCodeableConcept syntheaCode `json:"locationCodeableConcept"` 348 Net syntheaCurrency `json:"net"` 349 ProcedureSequence []int64 `json:"procedureSequence"` 350 ProductOrService syntheaCode `json:"productOrService"` 351 Sequence int64 `json:"sequence"` 352 ServicedPeriod syntheaRange `json:"servicedPeriod"` 353 } `json:"item"` 354 LifecycleStatus string `json:"lifecycleStatus"` 355 ManagingOrganization []syntheaReference `json:"managingOrganization"` 356 MaritalStatus syntheaCode `json:"maritalStatus"` 357 MedicationCodeableConcept syntheaCode `json:"medicationCodeableConcept"` 358 MultipleBirthBoolean bool `json:"multipleBirthBoolean"` 359 Name RawValue `json:"name"` 360 NumberOfInstances int64 `json:"numberOfInstances"` 361 NumberOfSeries int64 `json:"numberOfSeries"` 362 OccurrenceDateTime time.Time `json:"occurrenceDateTime"` 363 OnsetDateTime time.Time `json:"onsetDateTime"` 364 Outcome string `json:"outcome"` 365 Participant []struct { 366 Individual syntheaReference `json:"individual"` 367 Member syntheaReference `json:"member"` 368 Role []syntheaCode `json:"role"` 369 } `json:"participant"` 370 Patient syntheaReference `json:"patient"` 371 Payment *struct { 372 Amount syntheaCurrency `json:"amount"` 373 } `json:"payment"` 374 PerformedPeriod syntheaRange `json:"performedPeriod"` 375 Period syntheaRange `json:"period"` 376 Prescription syntheaReference `json:"prescription"` 377 PrimarySource bool `json:"primarySource"` 378 Priority syntheaCode `json:"priority"` 379 Procedure []struct { 380 ProcedureReference syntheaReference `json:"procedureReference"` 381 Sequence int64 `json:"sequence"` 382 } `json:"procedure"` 383 Provider syntheaReference `json:"provider"` 384 ReasonCode []syntheaCode `json:"reasonCode"` 385 ReasonReference []syntheaReference `json:"reasonReference"` 386 RecordedDate time.Time `json:"recordedDate"` 387 Referral syntheaReference `json:"referral"` 388 Requester syntheaReference `json:"requester"` 389 ResourceType string `json:"resourceType"` 390 Result []syntheaReference `json:"result"` 391 Series []struct { 392 BodySite syntheaCoding `json:"bodySite"` 393 Instance []struct { 394 Number int64 `json:"number"` 395 SopClass syntheaCoding `json:"sopClass"` 396 Title string `json:"title"` 397 UID string `json:"uid"` 398 } `json:"instance"` 399 Modality syntheaCoding `json:"modality"` 400 Number int64 `json:"number"` 401 NumberOfInstances int64 `json:"numberOfInstances"` 402 Started string `json:"started"` 403 UID string `json:"uid"` 404 } `json:"series"` 405 ServiceProvider syntheaReference `json:"serviceProvider"` 406 Started time.Time `json:"started"` 407 Status string `json:"status"` 408 Subject syntheaReference `json:"subject"` 409 SupportingInfo []struct { 410 Category syntheaCode `json:"category"` 411 Sequence int64 `json:"sequence"` 412 ValueReference syntheaReference `json:"valueReference"` 413 } `json:"supportingInfo"` 414 Telecom []map[string]string `json:"telecom"` 415 Text map[string]string `json:"text"` 416 Total RawValue `json:"total"` 417 Type RawValue `json:"type"` 418 Use string `json:"use"` 419 VaccineCode syntheaCode `json:"vaccineCode"` 420 ValueCodeableConcept syntheaCode `json:"valueCodeableConcept"` 421 ValueQuantity syntheaCoding `json:"valueQuantity"` 422 VerificationStatus syntheaCode `json:"verificationStatus"` 423 } `json:"resource"` 424 } `json:"entry"` 425 ResourceType string `json:"resourceType"` 426 Type string `json:"type"` 427 } 428 syntheaCode struct { 429 Coding []syntheaCoding `json:"coding"` 430 Text string `json:"text"` 431 } 432 syntheaCoding struct { 433 Code string `json:"code"` 434 Display string `json:"display"` 435 System string `json:"system"` 436 Unit string `json:"unit"` 437 Value float64 `json:"value"` 438 } 439 syntheaReference struct { 440 Display string `json:"display"` 441 Reference string `json:"reference"` 442 } 443 syntheaAddress struct { 444 City string `json:"city"` 445 Country string `json:"country"` 446 Extension []syntheaExtension `json:"extension"` 447 Line []string `json:"line"` 448 PostalCode string `json:"postalCode"` 449 State string `json:"state"` 450 } 451 syntheaExtension struct { 452 URL string `json:"url"` 453 ValueAddress syntheaAddress `json:"valueAddress"` 454 ValueCode string `json:"valueCode"` 455 ValueDecimal float64 `json:"valueDecimal"` 456 ValueString string `json:"valueString"` 457 Extension []syntheaExtension `json:"extension"` 458 } 459 syntheaRange struct { 460 End time.Time `json:"end"` 461 Start time.Time `json:"start"` 462 } 463 syntheaCurrency struct { 464 Currency string `json:"currency"` 465 Value float64 `json:"value"` 466 } 467 ) 468 469 type ( 470 twitterRoot struct { 471 Statuses []twitterStatus `json:"statuses"` 472 SearchMetadata struct { 473 CompletedIn float64 `json:"completed_in"` 474 MaxID int64 `json:"max_id"` 475 MaxIDStr int64 `json:"max_id_str,string"` 476 NextResults string `json:"next_results"` 477 Query string `json:"query"` 478 RefreshURL string `json:"refresh_url"` 479 Count int `json:"count"` 480 SinceID int `json:"since_id"` 481 SinceIDStr int `json:"since_id_str,string"` 482 } `json:"search_metadata"` 483 } 484 twitterStatus struct { 485 Metadata struct { 486 ResultType string `json:"result_type"` 487 IsoLanguageCode string `json:"iso_language_code"` 488 } `json:"metadata"` 489 CreatedAt string `json:"created_at"` 490 ID int64 `json:"id"` 491 IDStr int64 `json:"id_str,string"` 492 Text string `json:"text"` 493 Source string `json:"source"` 494 Truncated bool `json:"truncated"` 495 InReplyToStatusID int64 `json:"in_reply_to_status_id"` 496 InReplyToStatusIDStr int64 `json:"in_reply_to_status_id_str,string"` 497 InReplyToUserID int64 `json:"in_reply_to_user_id"` 498 InReplyToUserIDStr int64 `json:"in_reply_to_user_id_str,string"` 499 InReplyToScreenName string `json:"in_reply_to_screen_name"` 500 User twitterUser `json:"user,omitempty"` 501 Geo any `json:"geo"` 502 Coordinates any `json:"coordinates"` 503 Place any `json:"place"` 504 Contributors any `json:"contributors"` 505 RetweeetedStatus *twitterStatus `json:"retweeted_status"` 506 RetweetCount int `json:"retweet_count"` 507 FavoriteCount int `json:"favorite_count"` 508 Entities twitterEntities `json:"entities,omitempty"` 509 Favorited bool `json:"favorited"` 510 Retweeted bool `json:"retweeted"` 511 PossiblySensitive bool `json:"possibly_sensitive"` 512 Lang string `json:"lang"` 513 } 514 twitterUser struct { 515 ID int64 `json:"id"` 516 IDStr string `json:"id_str"` 517 Name string `json:"name"` 518 ScreenName string `json:"screen_name"` 519 Location string `json:"location"` 520 Description string `json:"description"` 521 URL any `json:"url"` 522 Entities twitterEntities `json:"entities"` 523 Protected bool `json:"protected"` 524 FollowersCount int `json:"followers_count"` 525 FriendsCount int `json:"friends_count"` 526 ListedCount int `json:"listed_count"` 527 CreatedAt string `json:"created_at"` 528 FavouritesCount int `json:"favourites_count"` 529 UtcOffset int `json:"utc_offset"` 530 TimeZone string `json:"time_zone"` 531 GeoEnabled bool `json:"geo_enabled"` 532 Verified bool `json:"verified"` 533 StatusesCount int `json:"statuses_count"` 534 Lang string `json:"lang"` 535 ContributorsEnabled bool `json:"contributors_enabled"` 536 IsTranslator bool `json:"is_translator"` 537 IsTranslationEnabled bool `json:"is_translation_enabled"` 538 ProfileBackgroundColor string `json:"profile_background_color"` 539 ProfileBackgroundImageURL string `json:"profile_background_image_url"` 540 ProfileBackgroundImageURLHTTPS string `json:"profile_background_image_url_https"` 541 ProfileBackgroundTile bool `json:"profile_background_tile"` 542 ProfileImageURL string `json:"profile_image_url"` 543 ProfileImageURLHTTPS string `json:"profile_image_url_https"` 544 ProfileBannerURL string `json:"profile_banner_url"` 545 ProfileLinkColor string `json:"profile_link_color"` 546 ProfileSidebarBorderColor string `json:"profile_sidebar_border_color"` 547 ProfileSidebarFillColor string `json:"profile_sidebar_fill_color"` 548 ProfileTextColor string `json:"profile_text_color"` 549 ProfileUseBackgroundImage bool `json:"profile_use_background_image"` 550 DefaultProfile bool `json:"default_profile"` 551 DefaultProfileImage bool `json:"default_profile_image"` 552 Following bool `json:"following"` 553 FollowRequestSent bool `json:"follow_request_sent"` 554 Notifications bool `json:"notifications"` 555 } 556 twitterEntities struct { 557 Hashtags []any `json:"hashtags"` 558 Symbols []any `json:"symbols"` 559 URL *twitterURL `json:"url"` 560 URLs []twitterURL `json:"urls"` 561 UserMentions []struct { 562 ScreenName string `json:"screen_name"` 563 Name string `json:"name"` 564 ID int64 `json:"id"` 565 IDStr int64 `json:"id_str,string"` 566 Indices []int `json:"indices"` 567 } `json:"user_mentions"` 568 Description struct { 569 URLs []twitterURL `json:"urls"` 570 } `json:"description"` 571 Media []struct { 572 ID int64 `json:"id"` 573 IDStr string `json:"id_str"` 574 Indices []int `json:"indices"` 575 MediaURL string `json:"media_url"` 576 MediaURLHTTPS string `json:"media_url_https"` 577 URL string `json:"url"` 578 DisplayURL string `json:"display_url"` 579 ExpandedURL string `json:"expanded_url"` 580 Type string `json:"type"` 581 Sizes map[string]struct { 582 W int `json:"w"` 583 H int `json:"h"` 584 Resize string `json:"resize"` 585 } `json:"sizes"` 586 SourceStatusID int64 `json:"source_status_id"` 587 SourceStatusIDStr int64 `json:"source_status_id_str,string"` 588 } `json:"media"` 589 } 590 twitterURL struct { 591 URL string `json:"url"` 592 URLs []twitterURL `json:"urls"` 593 ExpandedURL string `json:"expanded_url"` 594 DisplayURL string `json:"display_url"` 595 Indices []int `json:"indices"` 596 } 597 )