use_case.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // package use_case -- вариант использования
  2. package 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/goarch/lev1/size"
  9. "gitp78su.ipnodns.ru/svi/goarch/pkg/elems/elem_base"
  10. "gitp78su.ipnodns.ru/svi/kern/v3"
  11. )
  12. // UseCase -- вариант использования
  13. type UseCase struct {
  14. ElemBase_ *elem_base.ElemBase `yaml:"elem_base"`
  15. Size_ *size.Size `yaml:"size"`
  16. Links_ []alias.Id `yaml:"links"` // Список ссылок
  17. }
  18. var (
  19. hassert = kern.GetFnHassert()
  20. )
  21. // NewUseCase -- возвращает новый вариант использования
  22. func NewUseCase(elemBase *elem_base.ElemBase, size_ *size.Size) (*UseCase, error) {
  23. hassert(elemBase != nil, "NewUseCase(): elemBase==nil")
  24. id := elemBase.Id_
  25. _links0, isOk := elemBase.Elem_["links"]
  26. hassert(isOk, "NewUseCase(): id=%q, links not found", id)
  27. _links, isOk := _links0.([]interface{})
  28. hassert(isOk, "NewUseCase(): id=%q, `links`(%+v) not []interface{}", id, _links0)
  29. var links []alias.Id
  30. for _, _id := range _links {
  31. id0, isOk := _id.(string)
  32. hassert(isOk, "NewUseCase(): id=%q, `link`(%T, %+v) not string", id, _id, _id)
  33. id1 := alias.Id(id0)
  34. hassert(id1 != "", "NewUseCase(): id=%q, `link` is empty", id)
  35. links = append(links, id1)
  36. }
  37. sf := &UseCase{
  38. ElemBase_: elemBase,
  39. Size_: size_,
  40. Links_: links,
  41. }
  42. return sf, nil
  43. }
  44. // Check -- проверяет корректность элемента
  45. func (sf *UseCase) Check(mapElem map[alias.Id]types.IElemDrawer) string {
  46. var msgErr string
  47. // Нет ссылок
  48. if len(sf.Links_) == 0 {
  49. return fmt.Sprintf("id=%q, нет собственных ссылок", sf.ElemBase_.Id_)
  50. }
  51. // Проверить, что ссылки реально существует
  52. for _, id := range sf.Links_ {
  53. link, ok := mapElem[id]
  54. if !ok {
  55. msgErr += fmt.Sprintf("id=%q, собственная ссылка не существует\n", id)
  56. continue
  57. }
  58. if link.Type() != cons.TypeUseLink {
  59. msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
  60. continue
  61. }
  62. ln, isOk := link.(types.ILinker)
  63. if !isOk {
  64. msgErr += fmt.Sprintf("id=%q, не тип `link`, link=%#v\n", id, link)
  65. continue
  66. }
  67. // Проверить что ссылка взаимная
  68. if !(ln.SrcId() == sf.ElemBase_.Id_ || ln.DstId() == sf.ElemBase_.Id_) {
  69. msgErr += fmt.Sprintf("id=%q, ссылка не взаимная\nsrc=%q, dst=%q\n", id, ln.SrcId(), ln.DstId())
  70. }
  71. }
  72. return msgErr
  73. }
  74. // Links -- ссылки вариантов использования
  75. func (sf *UseCase) Links() []alias.Id {
  76. return sf.Links_
  77. }