স্পেশাল ফর্ম with এমন একটি উপায় দেয় যার সাহায্যে ব্যর্থ হতে পারে এমন একগুচ্ছ ধাপের "হ্যাপি পাথ"-এ মনোযোগ দেওয়া যায় এবং ব্যর্থতাগুলো পরে সামলানো যায়।
with {:ok, id} <- get_id(username),
{:ok, avatar} <- fetch_avatar(id),
{:ok, image_type} <- check_valid_image_type(avatar) do
{:ok, image_type, avatar}
else
:not_found ->
{:error, "invalid username"}
{:error, "not an image"} ->
{:error, "avatar associated to #{username} is not an image"}
err ->
err
end
প্রতিটি ধাপে, কোনো ক্লজ মিলে গেলে, do ব্লকটি চালানো পর্যন্ত শৃঙ্খলটি চলতে থাকে। কোনো একটি মিল ব্যর্থ হলে শৃঙ্খলটি থেমে যায় এবং যে ক্লজটি মেলেনি সেটি রিটার্ন করা হয়। ব্যর্থ মিলগুলো ধরে ফেলতে এবং রিটার্ন ভ্যালু পরিবর্তন করতে আপনি else ব্লক ব্যবহার করার সুযোগ পেয়েছেন।
আপনার পাসপোর্টের মেয়াদ শেষ হতে চলেছে, তাই নবায়ন করানোর জন্য আপনাকে একবার সিটি অফিসে যেতে হবে। আগের অভিজ্ঞতা থেকে আপনি জানেন যে, আপনার সিটি অফিসের সাথে কাজ করা সবসময় সহজ নয়, তাই আপনি সিদ্ধান্ত নেন যে, সর্বদা "হ্যাপি পাথ"-এ মনোযোগ রাখতে নিজের সর্বোচ্চটুকু করবেন।
নতুন পাসপোর্ট পাওয়ার জন্য প্রয়োজনীয় ফর্মটি আপনি প্রিন্ট করেন, সেটি পূরণ করেন, গাড়িতে উঠে পড়েন, ব্লকের চারপাশে ঘুরে আসেন, পার্ক করেন এবং অফিসের উদ্দেশ্যে রওনা হন।
নিচের সব কাজেই get_new_passport/3 ইমপ্লিমেন্ট করা ও এক্সটেন্ড করা লাগবে।
দেখা যায়, বিল্ডিংটি শুধু বিকেলে খোলা থাকে, আর প্রতিদিন একই সময়ে খোলে না।
বর্তমান সময় দিয়ে enter_building/1 ফাংশনটি কল করুন (যা আপনাকে get_new_passport/3-এর প্রথম আর্গুমেন্ট হিসেবে দেওয়া হয়েছে)। বিল্ডিং খোলা থাকলে ফাংশনটি :ok এবং পরে আপনার প্রয়োজন হবে এমন একটি টাইমস্ট্যাম্পসহ একটি টাপল রিটার্ন করবে, নাহলে :error ও একটি মেসেজসহ একটি টাপল রিটার্ন করবে। আপাতত হ্যাপি পাথটি :ok টাপলটি রিটার্ন করতে পারে।
যদি আপনি একটি :error টাপল পান, তাহলে সেটি রিটার্ন করতে else ব্লকটি ব্যবহার করুন।
ইনফরমেশন ডেস্কটি দীর্ঘ কফি বিরতি নেওয়ার জন্য কুখ্যাত। ভাগ্য ভালো থাকলে সেখানে কাউকে পেলে, তিনি আপনাকে একটি নির্দেশিকা ম্যানুয়াল দেবেন, যেখানে আপনার জন্মতারিখ অনুযায়ী কোন কাউন্টারে যেতে হবে তা ব্যাখ্যা করা থাকবে।
বর্তমান সময় দিয়ে find_counter_information/1 ফাংশনটি কল করুন। আপনি হয় :ok ও একটি অ্যানোনিমাস ফাংশন দ্বারা প্রকাশ করা ম্যানুয়ালসহ একটি টাপল পাবেন, নয়তো :coffee_break ও আরও নির্দেশনাসহ একটি টাপল পাবেন। যে হ্যাপি পাথে আপনি ম্যানুয়ালটি পান, সেখানে এটি আপনার জন্মতারিখে প্রয়োগ করুন (get_new_passport/3-এর দ্বিতীয় আর্গুমেন্ট)। এটি আপনার যেতে হবে এমন কাউন্টারের নম্বর রিটার্ন করবে। সেই কাউন্টার নম্বরসহ একটি :ok টাপল রিটার্ন করুন।
যদি আপনি :coffee_break মেসেজ পান, তাহলে :retry ও বর্তমান সময়ের ১৫ মিনিট পরের দিকে নির্দেশ করা একটি NaiveDateTime সহ একটি টাপল রিটার্ন করুন। আগের মতোই, :error টাপল পেলে সেটি রিটার্ন করুন।
কোনো এক কারণে, বিভিন্ন কাউন্টারে বিভিন্ন রঙের ফর্ম লাগে। অবশ্যই, ওয়েবসাইটে যেটি প্রথম পেয়েছিলেন সেটিই আপনি প্রিন্ট করেছেন, তাই আপনি হ্যাপি পাথে মনোযোগ দিয়ে সেরা ফলাফলের আশা করেন।
প্রবেশপথে পাওয়া টাইমস্ট্যাম্প, কাউন্টার এবং আপনি যে ফর্মটি এনেছেন (যা get_new_passport/3-এর শেষ আর্গুমেন্ট) দিয়ে stamp_form/3 ফাংশনটি কল করুন। আপনি হয় :ok ও আপনার পাসপোর্ট নম্বর যাচাই করতে ব্যবহৃত হবে এমন একটি চেকসামসহ একটি টাপল পাবেন, নয়তো :error ও একটি মেসেজসহ একটি টাপল পাবেন। আপনার হ্যাপি পাথ যেন চেকসামসহ একটি :ok টাপল রিটার্ন করে। :error টাপল পেলে সেটি রিটার্ন করুন।
অবশেষে, আপনার প্রয়োজনীয় সব নথি আপনার হাতে এসে গেছে।
টাইমস্ট্যাম্প, কাউন্টার এবং আগে পাওয়া চেকসাম দিয়ে get_new_passport_number/3 কল করুন। আপনি আপনার চূড়ান্ত পাসপোর্ট নম্বরসহ একটি স্ট্রিং পাবেন; এরপর শুধু বাকি থাকে সেই স্ট্রিংটি :ok সহ একটি টাপলে রিটার্ন করা এবং বাড়ি চলে যাওয়া।
Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।