elem_use_case.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // package elem_use_case -- вариант использования
  2. package elem_use_case
  3. import (
  4. "fmt"
  5. "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
  6. "gitp78su.ipnodns.ru/svi/goarch/lev0/cons"
  7. "gitp78su.ipnodns.ru/svi/goarch/lev0/types"
  8. "gitp78su.ipnodns.ru/svi/kern/v3"
  9. )
  10. // UseCase -- вариант использования
  11. type UseCase struct {
  12. types.IElemBase
  13. Size_ types.ISize `yaml:"size"`
  14. Links_ map[alias.Id]types.IElemGroupLink `yaml:"links"` // Список ссылок
  15. }
  16. var (
  17. hassert = kern.GetFnHassert()
  18. )
  19. // NewUseCase -- возвращает новый вариант использования
  20. func NewUseCase(elemBase types.IElemBase, size types.ISize,
  21. links map[alias.Id]types.IElemGroupLink) *UseCase {
  22. // id := elemBase.Id()
  23. // _links0, isOk := elemBase.Elem_["links"]
  24. // hassert(isOk, "NewUseCase(): id=%q, links not found", id)
  25. // _links, isOk := _links0.([]interface{})
  26. // hassert(isOk, "NewUseCase(): id=%q, `links`(%+v) not []interface{}", id, _links0)
  27. // for _, _id := range _links {
  28. // id0, isOk := _id.(string)
  29. // hassert(isOk, "NewUseCase(): id=%q, `link`(%T, %+v) not string", id, _id, _id)
  30. // id1 := alias.Id(id0)
  31. // hassert(id1 != "", "NewUseCase(): id=%q, `link` is empty", id)
  32. // links = append(links, id1)
  33. // }
  34. sf := &UseCase{
  35. IElemBase: elemBase,
  36. Size_: size,
  37. Links_: links,
  38. }
  39. sf.SelfCheck()
  40. return sf
  41. }
  42. // SelfCheck -- самопроверка
  43. func (sf *UseCase) SelfCheck() {
  44. sf.IElemBase.SelfCheck()
  45. hassert(sf.Size_ != nil, "UseCase.SelfCheck(): Size_ == nil")
  46. var msgErr string
  47. // Нет ссылок
  48. if len(sf.Links_) == 0 {
  49. return
  50. }
  51. // Проверить, что ссылки реально существует
  52. for id, link := range sf.Links_ {
  53. if link.Type() != cons.TypeUseLink {
  54. msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
  55. continue
  56. }
  57. ln, isOk := link.(types.IElemLink)
  58. if !isOk {
  59. msgErr += fmt.Sprintf("id=%q, не тип `link`, link=%#v\n", id, link)
  60. continue
  61. }
  62. // Проверить что ссылка взаимная
  63. if !(ln.Src().Id() == sf.Id() || ln.Dst().Id() == sf.Id()) {
  64. msgErr += fmt.Sprintf("id=%q, ссылка не взаимная\nsrc=%q, dst=%q\n",
  65. id, ln.Src().Id(), ln.Dst().Id())
  66. }
  67. }
  68. }
  69. // Links -- ссылки вариантов использования
  70. func (sf *UseCase) Links() map[alias.Id]types.IElemGroupLink {
  71. return sf.Links_
  72. }