feat: add create short url
This commit is contained in:
parent
c7be765c23
commit
31fde6cad6
8 changed files with 149 additions and 20 deletions
|
@ -85,10 +85,8 @@ func (s *CreateShortURLCreated) Encode(e *jx.Encoder) {
|
|||
// encodeFields encodes fields.
|
||||
func (s *CreateShortURLCreated) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
if s.Shorten.Set {
|
||||
e.FieldStart("shorten")
|
||||
s.Shorten.Encode(e)
|
||||
}
|
||||
e.FieldStart("shorten")
|
||||
e.Str(s.Shorten)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,13 +99,16 @@ func (s *CreateShortURLCreated) Decode(d *jx.Decoder) error {
|
|||
if s == nil {
|
||||
return errors.New("invalid: unable to decode CreateShortURLCreated to nil")
|
||||
}
|
||||
var requiredBitSet [1]uint8
|
||||
|
||||
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
|
||||
switch string(k) {
|
||||
case "shorten":
|
||||
requiredBitSet[0] |= 1 << 0
|
||||
if err := func() error {
|
||||
s.Shorten.Reset()
|
||||
if err := s.Shorten.Decode(d); err != nil {
|
||||
v, err := d.Str()
|
||||
s.Shorten = string(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
@ -121,6 +122,38 @@ func (s *CreateShortURLCreated) Decode(d *jx.Decoder) error {
|
|||
}); err != nil {
|
||||
return errors.Wrap(err, "decode CreateShortURLCreated")
|
||||
}
|
||||
// Validate required fields.
|
||||
var failures []validate.FieldError
|
||||
for i, mask := range [1]uint8{
|
||||
0b00000001,
|
||||
} {
|
||||
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
|
||||
// Mask only required fields and check equality to mask using XOR.
|
||||
//
|
||||
// If XOR result is not zero, result is not equal to expected, so some fields are missed.
|
||||
// Bits of fields which would be set are actually bits of missed fields.
|
||||
missed := bits.OnesCount8(result)
|
||||
for bitN := 0; bitN < missed; bitN++ {
|
||||
bitIdx := bits.TrailingZeros8(result)
|
||||
fieldIdx := i*8 + bitIdx
|
||||
var name string
|
||||
if fieldIdx < len(jsonFieldsNameOfCreateShortURLCreated) {
|
||||
name = jsonFieldsNameOfCreateShortURLCreated[fieldIdx]
|
||||
} else {
|
||||
name = strconv.Itoa(fieldIdx)
|
||||
}
|
||||
failures = append(failures, validate.FieldError{
|
||||
Name: name,
|
||||
Error: validate.ErrFieldRequired,
|
||||
})
|
||||
// Reset bit.
|
||||
result &^= 1 << bitIdx
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(failures) > 0 {
|
||||
return &validate.Error{Fields: failures}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -20,16 +20,16 @@ func (*CreateShortURLBadRequest) createShortURLRes() {}
|
|||
|
||||
type CreateShortURLCreated struct {
|
||||
// Created shorten URL. Going to this URL should redirect to URL from request body.
|
||||
Shorten OptString `json:"shorten"`
|
||||
Shorten string `json:"shorten"`
|
||||
}
|
||||
|
||||
// GetShorten returns the value of Shorten.
|
||||
func (s *CreateShortURLCreated) GetShorten() OptString {
|
||||
func (s *CreateShortURLCreated) GetShorten() string {
|
||||
return s.Shorten
|
||||
}
|
||||
|
||||
// SetShorten sets the value of Shorten.
|
||||
func (s *CreateShortURLCreated) SetShorten(val OptString) {
|
||||
func (s *CreateShortURLCreated) SetShorten(val string) {
|
||||
s.Shorten = val
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue