برای مدیریت بهتر کتابهایمان به یک کتابخانه نیاز داریم. این کتابخانه مقداری ظرفیت دارد که بیشتر از آن نمیتواند کتاب در خود جا دهد.
این کتابخانه مشخصات زیر را دارد:
+ از هر کتاب دقیقاً یکی دارد که یا موجود است و یا به یک نفر امانت داده شده است.
+ اسم کتابها به بزرگی و کوچکی حساس نیست، مثلاً `Golestan` و `gOlEsTan` دقیقاً یک کتاب هستند.
+ یک نفر میتواند چند کتاب را امانت بگیرد و از این نظر محدودیتی نیست.
+ در صورتی که یک کتاب امانت گرفته شده باشد، جایش همچنان محفوظ است و ظرفیت آن برای اضافه شدن کتاب دیگری باز نمیشود.
+ پیامهای خطای زیر از متدهای مختلف کتابخانه دریافت میشود. در صورتی که هیچ خطایی نباشد نیز `OK` داده میشود:
```
The book has not been borrowed
The book is already borrowed by <mark title="نام فرد امانتگیرنده"><borrower name></mark>
The book is already in the library
The book is not defined in the library
Not enough capacity
OK
```
تشخیص اینکه کدام ارور در چه زمان(ها)ی باید برگردانده شود بر عهدهی شماست.
![کتابخانه](https://quera.org/qbox/view/ZTKuxX15ue/books.jpg)
## جزئیات پروژه
پروژهی اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/181681/) دانلود کنید. ساختار فایلهای پروژه به صورت زیر است:
```
library/
├── go.mod
├── go.sum
├── main.go
└── main_sample_test.go
```
در فایل `main.go` چند تابع و متد وجود دارد که شما باید آنها را کامل کنید.
### تابع `NewLibrary`
این تابع یک اشارهگر به یک شی از نوع کتابخانه برمیگرداند. در این تابع باید یک شی جدید بسازید و ساختار داخلی آن را مطابق آنچه خودتان تعریف کردهاید مقداردهی کنید.
```go main.go go
type Library struct {
}
func NewLibrary(capacity int) *Library {
// TODO
return nil
}
```
### متد `AddBook`
در این متد شما اسم یک کتاب را گرفته و در صورتی که شرایط برقرار بود (مثلاً کتابخانه جا داشت و این کتاب قبلا در کتابخانه نبود) آن را اضافه میکنید و `OK` بر میگردانید. در غیر این صورت بسته به مورد ارور مناسب را در قالب یک رشته برمیگردانید.
```go main.go go
func (library *Library) AddBook(name string) string {
// TODO
return ""
}
```
\*راهنمایی: در صورتی که کتابخانه پر باشد و کتابی با نام تکراری وارد شود، خطای مربوط به کتاب تکراری (و نه پر بودن ظرفیت) باید برگردانده شود.*
### متد `BorrowBook` و `ReturnBook`
در این دو متد یک نفر یک کتاب را امانت میگیرد و سپس آن را پس میدهد.
در مواردی نیز ممکن است خطا پیش آید مثلا کتابی که امانت گرفته شده را دوباره کسی بخواهد امانت بگیرد یا کسی کتابی که در حال حاضر امانت گرفته نشده را بخواهد پس دهد.
```go main.go go
func (library *Library) BorrowBook(bookName, personName string) string {
// TODO
return ""
}
func (library *Library) ReturnBook(bookName string) string {
// TODO
return ""
}
```
# آنچه باید آپلود کنید
پس از پیادهسازی توابع خواسته شده، فایل `main.go` را آپلود کنید.