// 2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка/бібліотека;
взяти визначення мавка/пристрій;

простір мавка {
  простір бібліотека {
    структура АргументОбробника {
      М: *Машина;
      дані_шляху_ю8: *п8;
      шлях_ю8_треба_звільнити: логічне;
      дані_запису_ю8: *п8;
      відклик: *Притриманий;
    }

    внутрішня дія обробник_запису(помилка: природне, аргумент: адреса) {
      змінна аю8 = аргумент як *АргументОбробника;
      змінна М = аю8.М;
      змінна предмет_відклика = аю8.відклик.предмет;

      відпустити_притриманий_глобально(М, аю8.відклик);
      якщо аю8.шлях_ю8_треба_звільнити {
        звільнити(М, аю8.дані_шляху_ю8);
      }
      звільнити(М, аргумент);

      змінна інформація_падіння: ІнформаціяПадіння;

      змінна кількість_задіяних = п32(1);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = НЕДІЙСНЕ;

      якщо помилка != 0 {
        дані_задіяних[0] = ПРЕДМЕТ(створити_текст(
          М,
          "не вдалось записати"
        ));
      }

      здійснити(
        М,
        НЕДІЙСНЕ,
        ПРЕДМЕТ(предмет_відклика),
        Задіяні { ВидЗадіяних2, кількість_задіяних, дані_задіяних, 0 },
        МІСЦЕю8(М, ю8"вм://бібліотека/афс/записати.ц", 0),
      );
      якщо отримати_інформацію_падіння(М, інформація_падіння::адреса) {
        якщо М.налаштування.обробник_падінь == пусто {
          ЗАПАНІКУВАТИ(М, "необроблене падіння!");
        } інакше {
          вимкнути_стан_падіння(М);

          М.налаштування.обробник_падінь(
            М,
            інформація_падіння
          );
        }
      }
    }

    внутрішня дія рідна_дія__записати(
      М: *Машина,
      діяльність: *Діяльність
    ) -> ЗначенняАбоСтанПадіння {
      змінна задіяне_значення = НЕДІЙСНЕ;
      змінна знайдено_задіяне_значення = ні;
      змінна задіяне_куди = НЕДІЙСНЕ;
      змінна знайдено_задіяне_куди = ні;
      змінна задіяне_відклик = НЕДІЙСНЕ;
      змінна знайдено_задіяне_відклик = ні;

      знайдено_задіяне_значення = знайти_задіяне(М, діяльність.задіяні, 0, М.константи_назв._значення, задіяне_значення::адреса);
      знайдено_задіяне_куди = знайти_задіяне(М, діяльність.задіяні, 1, М.константи_назв._куди, задіяне_куди::адреса);
      знайдено_задіяне_відклик = знайти_задіяне(М, діяльність.задіяні, 2, М.константи_назв._відклик, задіяне_відклик::адреса);

      якщо не знайдено_задіяне_значення {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути текстом або даними."));
      }
      якщо не знайдено_задіяне_куди {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"куди\" має бути текстом або даними."));
      }

      змінна шлях_ю8 = ю8 { пусто, 0 };
      змінна шлях_ю8_треба_звільнити = ні;
      змінна дані_запису = Дані { 0, пусто };

      якщо задіяне_куди.вид == ЗПредмет {
        змінна предмет = задіяне_куди.дані як *Предмет;

        якщо предмет.клас == М.клас_Текст {
          змінна предмет_тексту = предмет як *ПредметТексту;
          змінна позиція_помилки: природне = 0;

          якщо не пристрій_мавки_перекодувати_кд_в_ю8(
            предмет_тексту.значення.розмір,
            предмет_тексту.значення.дані,
            шлях_ю8.розмір::адреса,
            шлях_ю8.дані::адреса,
            позиція_помилки::адреса
          ) {
            вернути ПАДІННЯ(М, створити_текст(М, "Не вдалося перекодувати куди в юнікод."));
          }

          шлях_ю8_треба_звільнити = так;
        } інакше якщо предмет.клас == М.клас_Дані {
          змінна предмет_даних = предмет як *ПредметДаних;

          шлях_ю8.розмір = предмет_даних.розмір;
          шлях_ю8.дані = предмет_даних.дані;
        } інакше {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"куди\" має бути текстом або даними."));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"куди\" має бути текстом або даними."));
      }

      якщо задіяне_значення.вид == ЗПредмет {
        змінна предмет = задіяне_значення.дані як *Предмет;

        якщо предмет.клас == М.клас_Текст {
          змінна предмет_тексту = предмет як *ПредметТексту;

          дані_запису.розмір = предмет_тексту.значення.розмір;
          дані_запису.дані = предмет_тексту.значення.дані;
        } інакше якщо предмет.клас == М.клас_Дані {
          змінна предмет_даних = предмет як *ПредметДаних;

          дані_запису.розмір = предмет_даних.розмір;
          дані_запису.дані = предмет_даних.дані;
        } інакше {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути текстом або даними."));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"значення\" має бути текстом або даними."));
      }

      якщо задіяне_відклик.вид != ЗПредмет {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"відклик\" має бути дією."));
      }

      змінна предмет_відклика = задіяне_відклик.дані як *Предмет;

      якщо предмет_відклика.клас != М.клас_Дія {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"відклик\" має бути дією."));
      }

      змінна ав = виділити<АргументОбробника>(М, 1);
      ав.М = М;
      ав.дані_шляху_ю8 = шлях_ю8.дані;
      ав.шлях_ю8_треба_звільнити = шлях_ю8_треба_звільнити;
      ав.дані_запису_ю8 = дані_запису.дані;
      ав.відклик = притримати_глобально(М, предмет_відклика);

      бібліотека_мавки_афс_записати(
        шлях_ю8.дані,
        шлях_ю8.розмір,
        дані_запису.дані,
        дані_запису.розмір,
        обробник_запису,
        ав,
      );

      вернути НЕДІЙСНЕ;
    }

    дія записати_дію__афс__записати(
      М: *Машина,
      предмет_модуля: *ПредметМодуля
    ) {
      змінна кількість_параметрів = природне(3);
      змінна дані_параметрів = виділити<Значення>(М, кількість_параметрів);

      дані_параметрів[0] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._значення,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[1] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._куди,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[2] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._відклик,
        пусто,
        НЕДІЙСНЕ
      ));

      змінна д = створити_рідну_дію(
        М,
        М.константи_назв._записати,
        створити_послідовність_без_копіювання(
          М,
          кількість_параметрів,
          дані_параметрів
        ),
        пусто,
        рідна_дія__записати,
        пусто
      );

      записати_властивість_модуля(
        М,
        предмет_модуля,
        М.константи_назв._записати,
        ПРЕДМЕТ(д)
      );
    }
  }
}