arch_use_case.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // package arch_use_case -- вариант использования
  2. package arch_use_case
  3. import (
  4. "fmt"
  5. // "gitp78su.ipnodns.ru/svi/kern/v3"
  6. "gitp78su.ipnodns.ru/svi/goarch/lev0/alias"
  7. "gitp78su.ipnodns.ru/svi/goarch/lev0/cons"
  8. "gitp78su.ipnodns.ru/svi/goarch/lev0/types"
  9. "gitp78su.ipnodns.ru/svi/goarch/lev1/arch_node"
  10. "gitp78su.ipnodns.ru/svi/goarch/lev1/arch_text"
  11. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
  12. )
  13. // ArchUseCase -- вариант использования
  14. type ArchUseCase struct {
  15. *arch_node.ArchNode
  16. Links_ []alias.ArchId `yaml:"links_id"` // Список ссылок
  17. links map[alias.ArchId]types.IArchLink
  18. TextId_ alias.ArchId `yaml:"text_id"` // ID текста
  19. text *arch_text.ArchText
  20. }
  21. // var (
  22. // hassert = kern.GetFnHassert()
  23. // )
  24. // NewUseCase -- возвращает новый вариант использования
  25. func NewUseCase(links []alias.ArchId, parentId alias.ArchId) *ArchUseCase {
  26. // id := elemBase.Id()
  27. // _links0, isOk := elemBase.Elem_["links"]
  28. // hassert(isOk, "NewUseCase(): id=%q, links not found", id)
  29. // _links, isOk := _links0.([]interface{})
  30. // hassert(isOk, "NewUseCase(): id=%q, `links`(%+v) not []interface{}", id, _links0)
  31. // for _, _id := range _links {
  32. // id0, isOk := _id.(string)
  33. // hassert(isOk, "NewUseCase(): id=%q, `link`(%T, %+v) not string", id, _id, _id)
  34. // id1 := alias.Id(id0)
  35. // hassert(id1 != "", "NewUseCase(): id=%q, `link` is empty", id)
  36. // links = append(links, id1)
  37. // }
  38. sf := &ArchUseCase{
  39. ArchNode: arch_node.NewArchNode("use_case", parentId),
  40. Links_: links,
  41. }
  42. sf.SelfCheck()
  43. _ = types.IArchUseCase(sf)
  44. return sf
  45. }
  46. // Text -- текст варианта использования
  47. //
  48. //go:fix inline
  49. func (sf *ArchUseCase) Text() types.IArchText {
  50. return sf.text
  51. }
  52. // InvarCheck -- проверка собственного состояния
  53. func (sf *ArchUseCase) InvarCheck() ktypes.Option[error] {
  54. optErr := sf.ArchNode.InvarNode()
  55. if optErr.IsVal() {
  56. err := fmt.Errorf("ArchUseCase.InvarCheck(): err=\n\t%w", optErr.Val())
  57. return ktypes.NewSome(err)
  58. }
  59. sf.SelfCheck()
  60. return ktypes.NewNone[error]()
  61. }
  62. // SelfCheck -- самопроверка
  63. func (sf *ArchUseCase) SelfCheck() {
  64. sf.InvarNode()
  65. var msgErr string
  66. // Нет ссылок
  67. if len(sf.Links_) == 0 {
  68. return
  69. }
  70. // Проверить, что ссылки реально существует
  71. for id, link := range sf.links {
  72. if link.Type() != cons.TypeUseLink {
  73. msgErr += fmt.Sprintf("id=%q, не тип %q, тип=%q\n", id, cons.TypeUseLink, link.Type())
  74. continue
  75. }
  76. // Проверить что ссылка взаимная
  77. if !(link.SrcId() == sf.Id() || link.DstId() == sf.Id()) {
  78. msgErr += fmt.Sprintf("id=%q, ссылка не взаимная\nsrc=%q, dst=%q\n",
  79. id, link.SrcId(), link.DstId())
  80. }
  81. }
  82. }
  83. // Links -- ссылки вариантов использования
  84. func (sf *ArchUseCase) Links() map[alias.ArchId]types.IArchLink {
  85. return sf.links
  86. }