لینک‌های مفید برای شرکت در مسابقه:

در طول مسابقه، می‌توانید سوال‌های خود را از قسمت «سؤال بپرسید» مطرح کنید.

بازوهای بله


بازوها در بله برای این که بتوانند درخواست‌هایشان را مطرح کنند از JSON استفاده می‌کنند، اما درخواست‌هایشان از قاعده‌ی خاصی پیروی نمی‌کند. بله که از این وضعیت خسته شده، از شما خواسته تا این درخواست‌ها را برایش ترجمه کنید و در قالب یک ساختار مشخص به او بدهید.

جزئیات پروژه🔗

پروژه‌ی اولیه را از این لینک دانلود کنید.

در این سؤال شما باید یک فایل JSON را که در کنار فایل اجرایی قرار دارد بخوانید و آن را تبدیل به ساختار ‍SendMessage کنید.

فیلدهای JSON ورودی به‌شرح زیر هستند:

  • فیلد chat_id : این فیلد یک عدد صحیح ۶۴ بیتی است که در ورودی می‌تواند به‌صورت عدد یا رشته داده شود. در ساختار خروجی، این فیلد باید دارای نوع رشته باشد. برای مثال در ورودی، این فیلد می‌تواند به صورت 123 و یا "123" داده شود، و مقداری که در ساختار برای این فیلد ذخیره می‌شود به‌صورت "123" است. این فیلد حتماً باید در فایل ورودی وجود داشته باشد و در غیر این‌صورت، باید ارور با پیام chat_id is empty برگردانید.

  • فیلد text: این فیلد مشخص‌کننده‌ی متن پیام بوده و از نوع رشته است. این فیلد نیز حتماً باید در ورودی وجود داشته باشد و رشته‌ی خالی نباشد. در غیر این‌صورت، باید ارور با پیام ‍text is empty را برگردانید.

  • فیلدparse_mode: این فیلد از نوع رشته است، اما می‌تواند در JSON ورودی نباشد (فیلدی ضروری نیست).

  • فیلد reply_markup: این فیلد از نوع ReplyMarkup بوده و فیلدی ضروری نیست و می‌تواند در ورودی نباشد. مقدار این فیلد، خود یک object است که حالت‌های زیر را می‌تواند داشته باشد:

{
        "keyboard" : [[{"text" : string, "request_contact" : bool, "request_location" : bool}]]
        "resize_keyboard" : bool
        "one_time_keyboard" : bool
        "selective" : bool
}
JSON

در این حالت، سه مقدار resize_keyboard و one_time_keyboard و selective از نوع bool هستند و فیلدهای ضروری نیستند. keyboard در این حالت فیلدی ضروری است و مقدار آن آرایه‌ای از آرایه‌هایی است که هر عنصر آن یک object با سه فیلد text و request_contact و request_location است. فیلدهای request_location و request_contact از نوع bool بوده و اجباری نیستند.

{
     "keyboard" : [[string, string]]
     "resize_keyboard" : bool
     "one_time_keyboard" : bool
     "selective" : bool
 }
JSON

تفاوت این حالت با حالت قبلی، تنها در این است که در این حالت، مقدار keyboard به صورت آرایه‌ای از آرایه‌هایی است که هر عنصر آن یک رشته است. در این حالت، هر رشته باید به‌عنوان مقدار برای کلید text درنظر گرفته شود.

{
   "inline_keyboard" : [[{"text" : string, "callback_data" : string, "url" : string}]]
}
JSON

در این حالت، یک فیلد ضروری inline_keyboard داده می‌شود که آرایه‌ای از آرایه‌هایی است که هر عنصر آن یک object است که در آن سه فیلد text و callback_data و url قرار دارد. دو فیلد callback_data و url ضروری نیستند.

{
   "inline_keyboard" : [[string, string]]
}
JSON

تفاوت این حالت با حالت قبلی، تنها در این است که در این حالت، مقدار inline_keyboard به‌صورت آرایه‌ای از آرایه‌هایی است که هر عنصر آن یک رشته است. در این حالت، هر رشته باید به‌عنوان مقدار برای کلید text در نظر گرفته شود.

توجه داشته باشید که هر یک از حالت‌های بالا می‌توانند در JSON ورودی به صورت رشته باشد. برای مثال، حالت دوم می تواند در فایل ورودی به‌صورت زیر باشد‌:

"{\"keyboard\" : [[\"string\",\"string\"], [\"string\", \"string\"]]}"
JSON

تابع ‍ReadSendMessageRequest(fileName string) را به‌گونه‌ای پیاده کنید که نام فایل را به‌عنوان ورودی دریافت کرده و JSON درون فایل را به ساختار SendMessage تبدیل کند. اگر خطایی وجود نداشت (تنها دو خطای گفته‌شده با متن خطای مشخص‌شده ممکن است رخ دهد و خطای دیگری وجود ندارد)، یک اشاره‌گر به این ساختار برگردانید و مقدار ارور را نیز nil برگردانید. در صورت وجود خطا، مقدار اشاره‌گر را nil و مقدار ارور را با خطای مناسب برگردانید.

آن‌چه باید آپلود کنید🔗

پس از پیاده‌سازی موارد خواسته شده، فایل main.go را آپلود کنید. در صورتی که از dependency خاصی استفاده کرده‌اید، فایل‌های go.mod و go.sum را به‌همراه فایل main.go زیپ کرده و آن را آپلود کنید.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.