#![warn(clippy::manual_find)]
#![allow(unused)]
#![allow(clippy::needless_return, clippy::uninlined_format_args)]

use std::collections::HashMap;

const ARRAY: &[u32; 5] = &[2, 7, 1, 9, 3];

fn lookup(n: u32) -> Option<u32> {
    for &v in ARRAY {
        //~^ manual_find
        if v == n {
            return Some(v);
        }
    }
    None
}

fn with_pat(arr: Vec<(u32, u32)>) -> Option<u32> {
    for (a, _) in arr {
        //~^ manual_find
        if a.is_multiple_of(2) {
            return Some(a);
        }
    }
    None
}

struct Data {
    name: String,
    is_true: bool,
}
fn with_struct(arr: Vec<Data>) -> Option<Data> {
    for el in arr {
        //~^ manual_find
        if el.name.len() == 10 {
            return Some(el);
        }
    }
    None
}

struct Tuple(usize, usize);
fn with_tuple_struct(arr: Vec<Tuple>) -> Option<usize> {
    for Tuple(a, _) in arr {
        //~^ manual_find
        if a >= 3 {
            return Some(a);
        }
    }
    None
}

struct A;
impl A {
    fn should_keep(&self) -> bool {
        true
    }
}
fn with_method_call(arr: Vec<A>) -> Option<A> {
    for el in arr {
        //~^ manual_find
        if el.should_keep() {
            return Some(el);
        }
    }
    None
}

fn with_closure(arr: Vec<u32>) -> Option<u32> {
    let f = |el: u32| -> u32 { el + 10 };
    for el in arr {
        //~^ manual_find
        if f(el) == 20 {
            return Some(el);
        }
    }
    None
}

fn with_closure2(arr: HashMap<String, i32>) -> Option<i32> {
    let f = |el: i32| -> bool { el == 10 };
    for &el in arr.values() {
        //~^ manual_find
        if f(el) {
            return Some(el);
        }
    }
    None
}

fn with_bool(arr: Vec<Data>) -> Option<Data> {
    for el in arr {
        //~^ manual_find
        if el.is_true {
            return Some(el);
        }
    }
    None
}

fn with_side_effects(arr: Vec<u32>) -> Option<u32> {
    for v in arr {
        if v == 1 {
            println!("side effect");
            return Some(v);
        }
    }
    None
}

fn with_else(arr: Vec<u32>) -> Option<u32> {
    for el in arr {
        if el.is_multiple_of(2) {
            return Some(el);
        } else {
            println!("{}", el);
        }
    }
    None
}

fn tuple_with_ref(v: [(u8, &u8); 3]) -> Option<u8> {
    for (_, &x) in v {
        //~^ manual_find
        if x > 10 {
            return Some(x);
        }
    }
    None
}

fn ref_to_tuple_with_ref(v: &[(u8, &u8)]) -> Option<u8> {
    for &(_, &x) in v {
        //~^ manual_find
        if x > 10 {
            return Some(x);
        }
    }
    None
}

fn explicit_ret(arr: Vec<i32>) -> Option<i32> {
    for x in arr {
        //~^ manual_find
        if x >= 5 {
            return Some(x);
        }
    }
    return None;
}

fn plus_one(a: i32) -> Option<i32> {
    Some(a + 1)
}
fn fn_instead_of_some(a: &[i32]) -> Option<i32> {
    for &x in a {
        if x == 1 {
            return plus_one(x);
        }
    }
    None
}

fn for_in_condition(a: &[i32], b: bool) -> Option<i32> {
    if b {
        for &x in a {
            if x == 1 {
                return Some(x);
            }
        }
    }
    None
}

fn intermediate_statements(a: &[i32]) -> Option<i32> {
    for &x in a {
        if x == 1 {
            return Some(x);
        }
    }

    println!("side effect");

    None
}

fn mixed_binding_modes(arr: Vec<(i32, String)>) -> Option<i32> {
    for (x, mut s) in arr {
        if x == 1 && s.as_mut_str().len() == 2 {
            return Some(x);
        }
    }
    None
}

fn as_closure() {
    #[rustfmt::skip]
    let f = |arr: Vec<i32>| -> Option<i32> {
        for x in arr {
        //~^ manual_find
            if x < 1 {
                return Some(x);
            }
        }
        None
    };
}

fn in_block(a: &[i32]) -> Option<i32> {
    let should_be_none = {
        for &x in a {
            if x == 1 {
                return Some(x);
            }
        }
        None
    };

    assert!(should_be_none.is_none());

    should_be_none
}

// Not handled yet
fn mut_binding(v: Vec<String>) -> Option<String> {
    for mut s in v {
        if s.as_mut_str().len() > 1 {
            return Some(s);
        }
    }
    None
}

fn subpattern(v: Vec<[u32; 32]>) -> Option<[u32; 32]> {
    for a @ [first, ..] in v {
        if a[12] == first {
            return Some(a);
        }
    }
    None
}

fn two_bindings(v: Vec<(u8, u8)>) -> Option<u8> {
    for (a, n) in v {
        if a == n {
            return Some(a);
        }
    }
    None
}

fn main() {}

mod issue14826 {
    fn adjust_fixable(needle: &str) -> Option<&'static str> {
        for candidate in &["foo", "bar"] {
            //~^ manual_find
            if candidate.eq_ignore_ascii_case(needle) {
                return Some(candidate);
            }
        }
        None
    }

    fn adjust_unfixable(needle: &str) -> Option<*const str> {
        for &candidate in &["foo", "bar"] {
            //~^ manual_find
            if candidate.eq_ignore_ascii_case(needle) {
                return Some(candidate);
            }
        }
        None
    }
}
