Snippets

Alexey Luchko x3 (1)

Created by Alexey Luchko
https://peter.bourgon.org/go-best-practices-2016/
http://peter.bourgon.org/blog/2017/06/09/theory-of-modern-go.html

type ImageSource interface {
  GetImage(...) ...
}

type H struct {
  GetImage func(id string) (image.Image, error)
  GetImage ImageSource

   //Formatter func (http.ResponceWriter, image.Image)
   Formatter func (io.Writer, image.Image)
}

func main() {
//  GetImage func(id string) (image.Image, error)

http.Handle("/user/150/", &H{
  GetImage: NewImageSource("/srv/static/image/user/")
})

http.Handle("/user/150/", &H{
  GetImage: NewImageSource("/srv/static/image/user/").GetImage
})

http.Handle("/user/150/", &H{
  GetImage: ImageSource("/srv/static/image/user/").GetImage
})

// GetImage ImageSource interface

http.Handle("/user/150/", &H{
  GetImage: NewImageSource("/srv/static/image/user/")
})

http.Handle("/user/150/", &H{
  GetImage: ImageSource("/srv/static/image/user/")
})

}

type ImageSource func(id string) (image.Image, error)

func NewImageSource(root string) ImageSource  {
  return func(id string) {
    p := path.Join(root, id[-2:], id)
    f, err := os.Open(p)
    if err != nil {
      return nil, err
    }
    defer f.Close()

    return image.Decode(f)
  }
}

type ImageSource struct {
  root string
}

func NewImageSource(root string) ImageSource  {
  return ImageSource{root}
}

func (s ImageSource) GetImage(id string) {
  p := path.Join(s.root, id[-2:], id)
  f, err := os.Open(p)
  if err != nil {
    return nil, err
  }
  defer f.Close()

  return image.Decode(f)
}


type ImageSource  string

func (root ImageSource) GetImage(id string) {
  p := path.Join(root, id[-2:], id)
  f, err := os.Open(p)
  if err != nil {
    return nil, err
  }
  defer f.Close()

  return image.Decode(f)
}



func (h H) ServeHTTP(w ..., r ...)  {
  id, err := h.getID(r.URL.Path)
  if err != nil {
    ...
  }

  img, err := h.GetImage(id)
  if err != nil {
    ...
  }

  img := h.resize(img)


  h.Formatter(w, img)
  
}


type ImageEncoder interface {
    Encode(io.Writer, image.Image)
}

type H2 struct {
   ImageEncoder
}

func (h H2) ServeHTTP(w ..., r ...)  {
  ....

  h.ImageEncoder.Encode(w, img)
  
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.