github.com/pivotal-cf/go-pivnet/v6@v6.0.2/dependency_specifiers.go (about) 1 package pivnet 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 ) 9 10 type DependencySpecifiersService struct { 11 client Client 12 } 13 14 type DependencySpecifiersResponse struct { 15 DependencySpecifiers []DependencySpecifier `json:"dependency_specifiers,omitempty"` 16 } 17 18 type DependencySpecifierResponse struct { 19 DependencySpecifier DependencySpecifier `json:"dependency_specifier,omitempty"` 20 } 21 22 type DependencySpecifier struct { 23 ID int `json:"id,omitempty" yaml:"id,omitempty"` 24 Product Product `json:"product,omitempty" yaml:"product,omitempty"` 25 Specifier string `json:"specifier,omitempty" yaml:"specifier,omitempty"` 26 } 27 28 func (r DependencySpecifiersService) List(productSlug string, releaseID int) ([]DependencySpecifier, error) { 29 url := fmt.Sprintf( 30 "/products/%s/releases/%d/dependency_specifiers", 31 productSlug, 32 releaseID, 33 ) 34 35 var response DependencySpecifiersResponse 36 resp, err := r.client.MakeRequest( 37 "GET", 38 url, 39 http.StatusOK, 40 nil, 41 ) 42 if err != nil { 43 return nil, err 44 } 45 defer resp.Body.Close() 46 47 err = json.NewDecoder(resp.Body).Decode(&response) 48 if err != nil { 49 return nil, err 50 } 51 52 return response.DependencySpecifiers, nil 53 } 54 55 func (r DependencySpecifiersService) Get(productSlug string, releaseID int, dependencySpecifierID int) (DependencySpecifier, error) { 56 url := fmt.Sprintf( 57 "/products/%s/releases/%d/dependency_specifiers/%d", 58 productSlug, 59 releaseID, 60 dependencySpecifierID, 61 ) 62 63 resp, err := r.client.MakeRequest( 64 "GET", 65 url, 66 http.StatusOK, 67 nil, 68 ) 69 if err != nil { 70 return DependencySpecifier{}, err 71 } 72 defer resp.Body.Close() 73 74 var response DependencySpecifierResponse 75 err = json.NewDecoder(resp.Body).Decode(&response) 76 if err != nil { 77 return DependencySpecifier{}, err 78 } 79 80 return response.DependencySpecifier, nil 81 } 82 83 func (r DependencySpecifiersService) Create( 84 productSlug string, 85 releaseID int, 86 dependentProductSlug string, 87 specifier string, 88 ) (DependencySpecifier, error) { 89 url := fmt.Sprintf( 90 "/products/%s/releases/%d/dependency_specifiers", 91 productSlug, 92 releaseID, 93 ) 94 95 body := createDependencySpecifierBody{ 96 createDependencySpecifierBodyDependencySpecifier{ 97 ProductSlug: dependentProductSlug, 98 Specifier: specifier, 99 }, 100 } 101 102 b, err := json.Marshal(body) 103 if err != nil { 104 // Untested as we cannot force an error because we are marshalling 105 // a known-good body 106 return DependencySpecifier{}, err 107 } 108 109 resp, err := r.client.MakeRequest( 110 "POST", 111 url, 112 http.StatusCreated, 113 bytes.NewReader(b), 114 ) 115 if err != nil { 116 return DependencySpecifier{}, err 117 } 118 defer resp.Body.Close() 119 120 var response DependencySpecifierResponse 121 err = json.NewDecoder(resp.Body).Decode(&response) 122 if err != nil { 123 return DependencySpecifier{}, err 124 } 125 126 return response.DependencySpecifier, nil 127 } 128 129 func (r DependencySpecifiersService) Delete( 130 productSlug string, 131 releaseID int, 132 dependencySpecifierID int, 133 ) error { 134 url := fmt.Sprintf( 135 "/products/%s/releases/%d/dependency_specifiers/%d", 136 productSlug, 137 releaseID, 138 dependencySpecifierID, 139 ) 140 141 resp, err := r.client.MakeRequest( 142 "DELETE", 143 url, 144 http.StatusNoContent, 145 nil, 146 ) 147 if err != nil { 148 return err 149 } 150 defer resp.Body.Close() 151 152 return nil 153 } 154 155 type createDependencySpecifierBody struct { 156 DependencySpecifier createDependencySpecifierBodyDependencySpecifier `json:"dependency_specifier"` 157 } 158 159 type createDependencySpecifierBodyDependencySpecifier struct { 160 ProductSlug string `json:"product_slug"` 161 Specifier string `json:"specifier"` 162 }