| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package proxy |
| |
| import "fmt" |
| |
| // Module represents a module version used by the proxy server. |
| type Module struct { |
| ModulePath string |
| Version string |
| Files map[string]string |
| NotCached bool // if true, behaves like it's uncached |
| zip []byte |
| } |
| |
| // ChangePath returns a copy of m with a different module path. |
| func (m *Module) ChangePath(modulePath string) *Module { |
| m2 := *m |
| m2.ModulePath = modulePath |
| return &m2 |
| } |
| |
| // ChangeVersion returns a copy of m with a different version. |
| func (m *Module) ChangeVersion(version string) *Module { |
| m2 := *m |
| m2.Version = version |
| return &m2 |
| } |
| |
| // AddFile returns a copy of m with an additional file. It |
| // panics if the filename is already present. |
| func (m *Module) AddFile(filename, contents string) *Module { |
| return m.setFile(filename, &contents, false) |
| } |
| |
| // DeleteFile returns a copy of m with filename removed. |
| // It panics if filename is not present. |
| func (m *Module) DeleteFile(filename string) *Module { |
| return m.setFile(filename, nil, true) |
| } |
| |
| // ReplaceFile returns a copy of m with different contents for filename. |
| // It panics if filename is not present. |
| func (m *Module) ReplaceFile(filename, contents string) *Module { |
| return m.setFile(filename, &contents, true) |
| } |
| |
| func (m *Module) setFile(filename string, contents *string, mustExist bool) *Module { |
| _, ok := m.Files[filename] |
| if mustExist && !ok { |
| panic(fmt.Sprintf("%s@%s does not have a file named %s", m.ModulePath, m.Version, filename)) |
| } |
| if !mustExist && ok { |
| panic(fmt.Sprintf("%s@%s already has a file named %s", m.ModulePath, m.Version, filename)) |
| } |
| m2 := *m |
| if m.Files != nil { |
| m2.Files = map[string]string{} |
| for k, v := range m.Files { |
| m2.Files[k] = v |
| } |
| } |
| if contents == nil { |
| delete(m2.Files, filename) |
| } else { |
| m2.Files[filename] = *contents |
| } |
| return &m2 |
| } |