@@ -317,7 +317,7 @@ func (l *standardLoader) mergeResources(svc OpenAPIService, rscMap map[string]Re
317317 if rsc .GetServiceDocPath () != nil {
318318 sr = rsc .GetServiceDocPath ()
319319 }
320- err := l .mergeResource (svc , rsc , sr )
320+ err := l .mergeResource (k , svc , rsc , sr )
321321 if err != nil {
322322 return err
323323 }
@@ -330,7 +330,7 @@ func (l *standardLoader) mergeResourcesScoped(svc OpenAPIService, svcUrl string,
330330 scopedMap := make (map [string ]Resource )
331331 for k , rsc := range rr .GetResources () {
332332 if rr .ObtainServiceDocUrl (k ) == svcUrl {
333- err := l .mergeResource (svc , rsc , & ServiceRef {Ref : svcUrl })
333+ err := l .mergeResource (k , svc , rsc , & ServiceRef {Ref : svcUrl })
334334 if err != nil {
335335 return err
336336 }
@@ -349,14 +349,28 @@ func (l *standardLoader) mergeResourcesScoped(svc OpenAPIService, svcUrl string,
349349 return nil
350350}
351351
352- func (l * standardLoader ) mergeResource (svc OpenAPIService ,
352+ func (l * standardLoader ) mergeResource (
353+ rscKey string ,
354+ svc OpenAPIService ,
353355 rsc Resource ,
354356 sr * ServiceRef ,
355357) error {
356358 rsc .setService (svc ) // must happen before resolving inverses
359+ existingMethods := make (Methods )
360+ existingResource , existingResourceErr := svc .GetResource (rscKey )
361+ if existingResourceErr == nil && existingResource != nil {
362+ existingMethods = existingResource .GetMethods ()
363+ }
357364 for k , vOp := range rsc .GetMethods () {
358365 v := vOp
359366 v .setMethodKey (k )
367+ existingMethod , existingMethodExists := existingMethods [k ]
368+ if existingMethodExists {
369+ v = existingMethod
370+ v .setMethodKey (k )
371+ v .setResource (rsc )
372+ continue
373+ }
360374 // TODO: replicate this for the damned inverse
361375 err := l .resolveOperationRef (svc , rsc , & v , v .GetPathRef (), sr )
362376 if err != nil {
@@ -579,20 +593,23 @@ func LoadProviderDocFromFile(fileName string) (Provider, error) {
579593 return loadProviderDocFromBytes (bytes )
580594}
581595
582- func GetProviderDocBytes (prov string ) ([]byte , error ) {
583- fn , err := getProviderDoc (prov )
596+ func GetProviderDocBytes (prov string , fileRoot string ) ([]byte , error ) {
597+ fn , err := getProviderDoc (prov , fileRoot )
584598 if err != nil {
585599 return nil , err
586600 }
587601 return os .ReadFile (fn )
588602}
589603
590- func getServiceDoc (url string ) (io.ReadCloser , error ) {
591- return os .Open (path .Join (OpenapiFileRoot , url ))
604+ func getServiceDoc (url string , fileRoot string ) (io.ReadCloser , error ) {
605+ if fileRoot == "" {
606+ fileRoot = OpenapiFileRoot
607+ }
608+ return os .Open (path .Join (fileRoot , url ))
592609}
593610
594- func getServiceDocBytes (url string ) ([]byte , error ) {
595- f , err := getServiceDoc (url )
611+ func getServiceDocBytes (url string , fileRoot string ) ([]byte , error ) {
612+ f , err := getServiceDoc (url , fileRoot )
596613 if err != nil {
597614 return nil , err
598615 }
@@ -606,16 +623,16 @@ func ReadService(b []byte) (Service, error) {
606623 return svc , err
607624}
608625
609- func GetResourcesRegisterDocBytes (url string ) ([]byte , error ) {
610- return getServiceDocBytes (url )
626+ func GetResourcesRegisterDocBytes (url string , fileRoot string ) ([]byte , error ) {
627+ return getServiceDocBytes (url , fileRoot )
611628}
612629
613- func GetServiceDocBytes (url string ) ([]byte , error ) {
614- return getServiceDocBytes (url )
630+ func GetServiceDocBytes (url string , fileRoot string ) ([]byte , error ) {
631+ return getServiceDocBytes (url , fileRoot )
615632}
616633
617- func LoadProviderByName (prov , version string ) (Provider , error ) {
618- b , err := GetProviderDocBytes (path .Join (prov , version ))
634+ func LoadProviderByName (prov , version string , fileRoot string ) (Provider , error ) {
635+ b , err := GetProviderDocBytes (path .Join (prov , version ), fileRoot )
619636 if err != nil {
620637 return nil , err
621638 }
@@ -641,12 +658,15 @@ func findLatestDoc(serviceDir string) (string, error) {
641658 return path .Join (serviceDir , fileNames [fileCount - 1 ]), nil
642659}
643660
644- func getProviderDoc (provider string ) (string , error ) {
661+ func getProviderDoc (provider string , fileRoot string ) (string , error ) {
662+ if fileRoot == "" {
663+ fileRoot = OpenapiFileRoot
664+ }
645665 switch provider {
646666 case "google" :
647- return findLatestDoc (path .Join (OpenapiFileRoot , "googleapis.com" ))
667+ return findLatestDoc (path .Join (fileRoot , "googleapis.com" ))
648668 }
649- return findLatestDoc (path .Join (OpenapiFileRoot , provider ))
669+ return findLatestDoc (path .Join (fileRoot , provider ))
650670}
651671
652672func loadOpenapiServiceDocFromBytes (ps ProviderService , bytes []byte ) (OpenAPIService , error ) {
@@ -763,6 +783,13 @@ func (loader *standardLoader) resolveOperationRef(doc OpenAPIService, rsc Resour
763783 }
764784
765785 component .setOperationRef (& OperationRef {Value : op , Ref : component .GetOperationRef ().Ref })
786+ response , responseExists := component .GetResponse ()
787+ if responseExists {
788+ err = loader .resolveExpectedResponse (doc , component .GetOperationRef ().Value , response )
789+ if err != nil {
790+ return err
791+ }
792+ }
766793 component .setPathItem (pi )
767794 err = loader .extractAndMergeQueryTransposeOpLevel (component )
768795 if err != nil {
0 commit comments