diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml
new file mode 100644
index 00000000..bb3c8f78
--- /dev/null
+++ b/.idea/caches/deviceStreaming.xml
@@ -0,0 +1,560 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 9c8e7400..a6e1098c 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/src/main/kotlin/Archive.kt b/src/main/kotlin/Archive.kt
new file mode 100644
index 00000000..cfba849e
--- /dev/null
+++ b/src/main/kotlin/Archive.kt
@@ -0,0 +1,15 @@
+class Archive(val name: String) {
+ val notes = mutableListOf()
+
+ override fun toString() = name
+
+ fun createNote() {
+ val title = InputHandler.readValidInput("Введите заголовок заметки:") { it.isNotEmpty() }
+ val content = InputHandler.readValidInput("Введите текст заметки:") { it.isNotEmpty() }
+ notes.add(Note(title, content))
+ }
+}
+
+class Note(val title: String, val content: String) {
+ override fun toString() = title
+}
\ No newline at end of file
diff --git a/src/main/kotlin/ArchiveMenu.kt b/src/main/kotlin/ArchiveMenu.kt
new file mode 100644
index 00000000..b136bb79
--- /dev/null
+++ b/src/main/kotlin/ArchiveMenu.kt
@@ -0,0 +1,11 @@
+class ArchiveMenu(private val archive: Archive) : Menu("Список заметок в архиве '${archive.name}'") {
+ override fun getItems() = archive.notes
+ override fun createItem() = archive.createNote()
+
+ override fun handleItemSelected(item: Note) {
+ println("\nЗаметка: ${item.title}")
+ println("Содержание:\n${item.content}")
+ println("\nНажмите Enter чтобы вернуться...")
+ readlnOrNull()
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/InputHandler.kt b/src/main/kotlin/InputHandler.kt
new file mode 100644
index 00000000..481e1788
--- /dev/null
+++ b/src/main/kotlin/InputHandler.kt
@@ -0,0 +1,10 @@
+object InputHandler {
+ fun readValidInput(prompt: String, validator: (String) -> Boolean): String {
+ while (true) {
+ println(prompt)
+ val input = readlnOrNull()?.trim() ?: ""
+ if (validator(input)) return input
+ println("Некорректный ввод, попробуйте снова")
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt
index aade54c5..c6f7eaaa 100644
--- a/src/main/kotlin/Main.kt
+++ b/src/main/kotlin/Main.kt
@@ -1,3 +1,3 @@
-fun main(args: Array) {
- println("Hello World!")
+fun main() {
+ NoteApp().start()
}
\ No newline at end of file
diff --git a/src/main/kotlin/Menu.kt b/src/main/kotlin/Menu.kt
new file mode 100644
index 00000000..c31b1a2d
--- /dev/null
+++ b/src/main/kotlin/Menu.kt
@@ -0,0 +1,32 @@
+abstract class Menu(private val title: String) {
+ abstract fun getItems(): List
+ abstract fun createItem()
+ abstract fun handleItemSelected(item: T)
+
+ fun show() {
+ while (true) {
+ println("\n$title:")
+ println("0. Создать")
+ getItems().forEachIndexed { index, item -> println("${index + 1}. ${item}") }
+ println("${getItems().size + 1}. Выход")
+
+ when (val choice = readChoice(getItems().size + 1)) {
+ 0 -> createItem()
+ getItems().size + 1 -> return
+ else -> handleItemSelected(getItems()[choice - 1])
+ }
+ }
+ }
+
+ private fun readChoice(max: Int): Int {
+ while (true) {
+ print("Выберите пункт: ")
+ val input = readlnOrNull()?.toIntOrNull()
+ when {
+ input == null -> println("Введите число!")
+ input in 0..max -> return input
+ else -> println("Некорректный выбор, попробуйте снова")
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/NoteApp.kt b/src/main/kotlin/NoteApp.kt
new file mode 100644
index 00000000..a9739e5e
--- /dev/null
+++ b/src/main/kotlin/NoteApp.kt
@@ -0,0 +1,34 @@
+class NoteApp {
+ private val archives = mutableListOf()
+
+ fun start() {
+ val mainMenu = object : Menu("Список архивов") {
+ override fun getItems() = archives
+ override fun createItem() {
+ createArchive()
+ }
+
+ override fun handleItemSelected(item: Archive) {
+ val notesMenu = object : Menu("Список заметок в архиве '${item.name}'") {
+ override fun getItems() = item.notes
+ override fun createItem() {
+ item.createNote()
+ }
+ override fun handleItemSelected(note: Note) {
+ println("\nЗаметка: ${note.title}")
+ println("Содержание:\n${note.content}")
+ println("\nНажмите Enter чтобы вернуться...")
+ readlnOrNull()
+ }
+ }
+ notesMenu.show()
+ }
+ }
+ mainMenu.show()
+ }
+
+ private fun createArchive() {
+ val name = InputHandler.readValidInput("Введите название архива:") { it.isNotEmpty() }
+ archives.add(Archive(name))
+ }
+}
\ No newline at end of file